Group-Patch Joint Compression: Compressing Dynamic B<sub>0</sub> and Static RF Spatial Modulations Across k-Space Subregion Groups for Highly Accelerated MRI.
The 10 matches
- [1] § Theory › Multidimensional Compressibility and Periodic Redundancy ↔ Recon/3D_CS_Wave_9T_RAM1T/Run_B0SENSE_recon.m, lines 107–140 · score 0.78 · variable density Poisson, phase encoded steps, receiver channels, disc, aliased, FFT
- [2] § Methods › Pulse Sequence and Data Acquisition ↔ Pulseq_sequence/writeWaveCAIPI.m, lines 47–93 · score 0.77 · dual ACS, retrospectively undersampled, Wave CAIPI, readout oversampling, strengths, phase encoding
- [3] § Methods › Two Data Compression Approaches ↔ Recon/2D_CS_LocalB0Coils_9T/Run_B0SENSE_recon.m, lines 44–70 · score 0.77 · local B0 coils, oversampled readout, modulation period, receiver channels, rapid B0 modulation, phase encoded
- [4] § Methods › Pulse Sequence and Data Acquisition ↔ Pulseq_sequence/writeWaveCAIPI.m, lines 47–93 · score 0.76 · slice oversampling, wave gradients, slice thickness, Wave CAIPI, 230, TE
- [5] § Methods › Pulse Sequence and Data Acquisition ↔ Recon/2D_CS_LocalB0Coils_9T/Run_B0SENSE_recon.m, lines 44–70 · score 0.76 · local B0 coil, B0 field modulations, readout oversampling, rapid B0 modulations, strengths, FLASH
- [6] § Methods › Two Data Compression Approaches ↔ Recon/3D_L2_WaveCAIPI_3T/Run_B0SENSE_recon.m, lines 206–256 · score 0.73 · RF sensitivity maps, composite encoding matrix, Wave CAIPI, modulation period, compression matrices, B0 modulation
- [7] § Methods › Two Image Reconstruction Algorithms ↔ Recon/3D_CS_Wave_9T_RAM1T/Run_B0SENSE_recon.m, lines 50–80 · score 0.66 · wavelet regularization, undersampling factor, compressed sensing, global, B0 modulation, thresholding
- [8] § Results › Visualization of Compressed Spatial Encoding Functions ↔ Recon/3D_L2_WaveCAIPI_3T/Run_B0SENSE_recon.m, lines 206–256 · score 0.66 · RF sensitivity maps, composite encoding, B0 modulation period, B0 encoding, joint compression, matrix
- [9] § Theory › From RF Array to Joint B0 ‐RF Compression ↔ Recon/2D_CS_LocalB0Coils_9T/Run_B0SENSE_recon.m, lines 175–222 · score 0.61 · composite spatial encoding, receiver channel, compression matrices, virtual, segmented, joint compression
- [10] § Results › RF‐Only Versus B0 ‐RF Compression for In Vivo 3D Scans at 9.4 T ↔ Recon/3D_L2_WaveCAIPI_3T/Run_B0SENSE_recon.m, lines 109–141 · score 0.61 · L2 Wave CAIPI, rapid B0 modulations, recon, compression factors, FLASH, joint compression
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
MATLAB · 529 lines · 19 KB · BSD-3-Clause · 3 matches
- %% Descriptions
- % This script is a basic demo of the joint compression technique
- % for 2D GRE data (2025-06-18, in-vivo, 9.4T human scanner with 8-channel local B0 coils)
- % with rapid B0 field modulation (readout oversampling),
- % and 32 RF receivers,
- % using compressed sensing reconstruction (FISTA).
- % For comparison, data with 4x RF array compression is also provided.
- % Please manually change the loaded data name to compare the speed.
- % In this implementation, the 2D readout encoding matrix is explicitly
- % written. This can be optimized by e.g., only writing readout encoding matrix
- % across a B0 modulation period, and reusing it for different periods, to
- % save memory. Nevertheless, this issue is not crucial for 2D.
- % Please cite the paper:
- % R.Tian, K.Scheffler, "Group-Patch Joint Compression: Compressing Dynamic B0 and Static RF Spatial Modulations Across k-Space Subregion Groups for Highly Accelerated MRI," Magnetic Resonance in Medicine, (2026), https://doi.org/10.1002/mrm.70439.
- % See Supporting Information Figure S3 for this dataset.
- % For questions, please contact Rui Tian
- % ([email hidden]/[email hidden])
- %% Environment
- % Add ToolBox to the path, for FFT, Wavelet((c) Michael Lustig 2007), and TV((c) Michael Lustig 2007) functions
- addpath(genpath('./'))
- %% Load data and parameters
- load('data_param_2D_JCS.mat')
- % load('data_param_2D_RFcompression.mat')
- fprintf('\n');
- disp('Data Loaded.')
- % Fully-sampled k-space data: dat_exp[oversampled readout,phase-encoding,1,1,RF receivers]
- % Auto-calibrated B0 modulation maps: maps_B0Evo[oversampled readout,read pixel,phase pixel]
- % maps_SENSE[read pixel,phase pixel,1,1,RF receivers]
- % idx_z2D: slice number for multi-slice experiments
- % img_fg: mask
- % para: parameters
- %% Specify some local parameters
- % In this script, you may not need to tune these below
- nRO = para.nty_unOS; % readout k-space point number without oversampling
- nx = para.ntx; % phase encoding k-space point number
- nC = para.nC; % RF receiver channel number
- nOS = para.nyOS_flash; % readout oversampling factor
- idx_us_x = para.idx_usx; % undersampling factor along phase encoding
- nRecoPix_yx = para.nRecoPix_yx; % in-plane pixel number in recon grid
- nNgCh = para.nNgCh; % local B0 coil channel
- nMR = nRO*nOS; % readout k-space point number with oversampling
- nGridMR = nRecoPix_yx*nOS; % For recon grid, readout k-space point with oversampling
- bSENSE = para.bSENSE; % 1: using multiple RF receivers for joint sampling acceleration with SENSE
- bNgAcc = para.bNgAcc; % 1: rapid B0 field modulation ON
- bJointComp = para.bCompRF==2; % 1: Joint compression ON, 0: Joint compression OFF
- bNLReco = para.bNLReco; % 1: Compressed-sensing with L1 regularization is ON, as this script
- bWaThres = para.bWaThres; % 1: global wavelet threshold, 2: level-dependent wavelet threshold
- para.kperiod; % This is the sinusoidal period (45 oversampled readout points) of rapid B0 modulation for this dataset.
- % You might tune the following to change regularization strengths
- lambda_TV = para.lambda_TV; % coefficient for TV regularization term. higher->stronger
- lambda_walet = para.lambda_walet; % coefficient for wavelet regularization term. higher->stronger
- if bJointComp==1 % if joint compression is ON
- % This dataset has B0 modulation with period of 45 readout k-space points (including 8x oversampling)
- ntSeg_cs = para.ntSeg_cs; % the readout k-space point number for one compression group, in a B0 modulation period.
- nJointCs = para.nJointCs; % the joint compression factor
- end
- %% RF array compression
- if para.bCompRF ==1
- disp('RF-only compression starts......')
- maps_SENSE_cal = squeeze(permute(maps_SENSE,[1,2,3,5,4]));%[read,phase,(3Dslice),RF,2Dslice]
- tstRFCs = tic;
- [matA] = ComputeMat_CSRF(maps_SENSE_cal,img_fg,para.nCompRF);
- para.tRFcs_transformation = toc(tstRFCs);
- fprintf('\n');
- disp(['Time for calculating RF compression matrix: ',num2str(para.tRFcs_transformation),' s'])
- dat_exp = permute(dat_exp,[1,2,5,3,4]);
- maps_SENSE = permute(maps_SENSE,[1,2,5,3,4]);
- tstRFCs = tic;
- [dat_exp,maps_SENSE] = CompressRF(dat_exp,maps_SENSE,matA);
- para.tRFcs_apply = toc(tstRFCs);
- fprintf('\n');
- disp(['Time for applying RF compression matrix: ',num2str(para.tRFcs_apply),' s'])
- fprintf('\n')
- dat_exp = permute(dat_exp,[1,2,4,5,3]);
- maps_SENSE = permute(maps_SENSE,[1,2,4,5,3]);
- end
- %% Swap input data dimensions for further processing
- % dat_exp[ny_OS,nx,nz3D,nz2D->1,nC] -> [ny_OS,nPEx_intlp,nPEz_intlp,nC,nz2D->1]
- dat_exp = permute(dat_exp,[1,2,3,5,4]);
- %% Retrospective undersampling mask
- % Initialize the mask (interpolated size)
- mask_kxz = zeros(nRecoPix_yx,1);
- disp(['The undersampling factor: ', num2str(idx_us_x)])
- % Define the sampling point in the mask
- mask_kxz(1:idx_us_x:end) = 1;
- mask_kxz = single(mask_kxz);
- img_fg = single(img_fg);
- % mask index in image and k-space
- [ind_kx,ind_kz] = find(mask_kxz==1);
- ind_k = find(mask_kxz==1);
- [ind_y,ind_x,ind_z] = ind2sub(size(img_fg),find(img_fg));
- ind_fg = find(img_fg==1);
- sz_kmask = size(mask_kxz);
- sz_fg = size(img_fg);
- % Apply undersampling mask to fully-sampled k-space data
- dat_exp = dat_exp.*reshape(mask_kxz,1,nRecoPix_yx,1);
- % Keep the undersampling data in image domain for optional check.
- img_exp_us = SymFft(dat_exp,[1 2 3]);
- img_exp_us_sos = sqrt(sum(img_exp_us.*conj(img_exp_us),4));
- % Reduce memory by discarding omitted phase-encoded steps
- dat_exp = reshape(dat_exp,[size(dat_exp,1),size(dat_exp,2)*size(dat_exp,3),size(dat_exp,4)]);
- dat_exp = dat_exp(:,ind_k,:);
- % Reorganize the data dimension for multiple receivers
- if bSENSE == 1
- dat_exp = permute(dat_exp,[1 3 2]);
- end
- %% Prepare readout encoding matrix
- ERead = single(1);
- % If rapid B0 modulation ON, take the auto-calibrated B0 modulation matrix
- if bNgAcc==1
- ERead = ERead.*maps_B0Evo; clear maps_B0Evo;
- end
- % Encoding matrix for
- % Cartesian sampling by linear gradient
- % - > oversampled frequency-encoding
- EFe = dftmtx(nGridMR);
- EFe = circshift(conj(EFe),[floor(nGridMR/2) floor(nGridMR/2)]);
- cen_PE = floor(nGridMR/2)+1;
- min_PE = cen_PE - floor(nRecoPix_yx/2);
- max_PE = cen_PE + ceil(nRecoPix_yx/2)-1;
- EFe = EFe(:,min_PE:max_PE); % [nty_RO,nRecoPix_yx]
- ERead = ERead.*EFe;
- ERead = reshape(ERead,nMR,[]);
- ERead = single(ERead(:,ind_fg));
- % Encoding matrix for RF receive sensitivity encoding
- sense_maps_reshape=0;
- para.recnC = size(maps_SENSE,5);
- if bJointComp == 0 % if no joint compression, readout amtrix combined with sense matrix
- sense_maps_reshape = reshape(maps_SENSE,[1,nRecoPix_yx*nRecoPix_yx,para.recnC]);
- ERead = ERead.*sense_maps_reshape(:,ind_fg,:); clear sense_maps_reshape;
- ERead = permute(ERead,[1 3 2]);
- ERead = reshape(ERead,[],length(ind_fg));
- end
- %% Joint compression to reduce the reeadout model size
- if bJointComp == 1 % Joint compression ON
- ntnC_cs = ntSeg_cs*nC/nJointCs; % the number of virtual k-space points compressed from (a reaodut segment + all receiver channels)
- if mod(nGridMR,ntSeg_cs)~=0 % Here, the total readout point number = integer x readout point number in a segment, for convenience processing
- error('Compression in readout time domain is not divided into interger number of regions')
- end
- % Reorganize sensitivity matrix
- maps_SENSE = reshape(permute(maps_SENSE,[5,1,2,3,4]),[1,nC,nRecoPix_yx*nRecoPix_yx]);
- maps_SENSE = single(maps_SENSE(:,:,ind_fg));
- % Initiate compression matrix
- matA = single(zeros(ntnC_cs,ntSeg_cs*nC,para.kperiod/ntSeg_cs));
- disp('Joint compression starts......')
- % Calculate compression matrices from composite spatial encoding
- % maps.
- tstJointCs = tic;
- for idt_seg = 1:(para.kperiod/ntSeg_cs) % loop over different compression groups in a B0 modulation period
- % index for a readout segment, for a compression group
- t_st = 1+(idt_seg-1)*ntSeg_cs;
- t_end = t_st +(ntSeg_cs-1);
- % select and reshape parts of ERead, for a compression group
- E_seg = reshape(ERead(t_st:t_end,:),ntSeg_cs,1,[]);
- % construct the composite encoding matrix, for a compression
- % group
- E_joint_pix = bsxfun(@times,maps_SENSE,E_seg);
- E_joint_pix = reshape(E_joint_pix,ntSeg_cs*nC,length(ind_fg));
- E_joint_H_pix = E_joint_pix';
- % scaling coefficient
- coeff_scale = reshape(sum(conj(E_joint_pix) .* E_joint_pix, 1),1,length(ind_fg)); % [1 x p]
- matP = (E_joint_pix./coeff_scale)*E_joint_H_pix;
- [U,S,V] = svd(matP,'econ');
- VH = V';
- matA(:,:,idt_seg)= VH(1:ntnC_cs,:);
- % There there a few residue data points not belonging to
- % sets of every ntSeg_cs readout points
- if mod(nGridMR,ntSeg_cs)~=0
- % index for readout segment
- t_end = nGridMR;
- t_st = t_end - (ntSeg_cs+mod(nGridMR,ntSeg_cs)) +1;
- % select and reshape parts of ERead
- E_seg = reshape(ERead(t_st:t_end,:),ntSeg_cs,1,[]);
- % initialize the matrix to be decomposed
- matP = zeros(nC*ntSeg_cs,nC*ntSeg_cs);
- % update the k-space compression matrix over all pixels
- E_joint_pix = bsxfun(@times,maps_SENSE,E_seg);
- E_joint_pix = reshape(E_joint_pix,ntSeg_cs*nC,length(ind_fg));
- E_joint_H_pix = E_joint_pix';
- % scaling vector, pixel dependent
- coeff_scale = reshape(sum(conj(E_joint_pix) .* E_joint_pix, 1),1,length(ind_fg)); % [1 x p]
- % square matrix P for a compression group
- matP = (E_joint_pix./coeff_scale)*E_joint_H_pix;
- % svd decompositing the square matrix P. the
- % compressibility can be checked vis S
- [U,S,V] = svd(matP,'econ');
- VH = V';
- % select the subsets of singular vectors
- ntnC_cs_last = round(length(t_st:t_end)*nC/nJointCs);
- matA_res= VH(1:ntnC_cs_last,:);
- end
- end
- fprintf('\n')
- X = (['The (joint) compression matrices are calculated, for compression factor: ',num2str(nC*ntSeg_cs/ntnC_cs)]);
- disp(X)
- fprintf('\n')
- para.tcs_transformation = toc(tstJointCs);
- disp(['Time for calculating compression matrices: ',num2str(para.tcs_transformation),' s'])
- fprintf('\n')
- % Apply the compression matrices
- tstJointCs_apply = tic;
- % If total readout points before compression ~= integer x readout
- % segment points in a compression group
- if mod(nGridMR,ntSeg_cs)~=0 % if remained readout points do not form a compression group
- tres_ed = nGridMR;
- tres_st = tres_ed - (ntSeg_cs+mod(nGridMR,ntSeg_cs)) +1;
- ERead_res = ERead(tres_st:tres_ed,:);
- dat_exp_res = dat_exp(tres_st:tres_ed,:,:);
- tsegs_st = 1;
- tsegs_ed = tres_st-1;
- else % simpler case
- tsegs_st = 1;
- tsegs_ed = nGridMR;
- end
- if round(length(tsegs_st:tsegs_ed)/para.kperiod)~=(length(tsegs_st:tsegs_ed)/para.kperiod)
- if mod(para.kperiod-mod(length(tsegs_st:tsegs_ed),para.kperiod),ntSeg_cs)~=0
- error('Error! Requires reprogramming of compressed groups. The remained readout pts cannot be compressed by given compression matrices.')
- end
- dat_exp = padarray(dat_exp,[para.kperiod-mod(length(tsegs_st:tsegs_ed),para.kperiod),0,0],0,'post');
- ERead = padarray(ERead,[para.kperiod-mod(length(tsegs_st:tsegs_ed),para.kperiod),0],0,'post');
- tsegs_ed = tsegs_ed+para.kperiod-mod(length(tsegs_st:tsegs_ed),para.kperiod);
- end
- % Reorganize data to be compressed
- dat_exp = dat_exp(tsegs_st:tsegs_ed,:,:);
- dat_exp = reshape(dat_exp,...
- ntSeg_cs,...
- para.kperiod/ntSeg_cs,...
- length(tsegs_st:tsegs_ed)/para.kperiod,...
- nC,...
- length(ind_k));
- dat_exp = permute(dat_exp,[1,4,2,3,5]);
- dat_exp = reshape(dat_exp,...
- ntSeg_cs*nC,...
- 1,...
- para.kperiod/ntSeg_cs,...
- length(tsegs_st:tsegs_ed)/para.kperiod,...
- length(ind_k)); % [nToBeComps,1,sets of comp. matrix,different mod. periods,phase encoding]
- % data is compressed
- dat_exp_cs = pagemtimes(matA,dat_exp);
- % Reorganize readout encoding matrix
- ERead = reshape(ERead,ntSeg_cs,para.kperiod/ntSeg_cs,length(tsegs_st:tsegs_ed)/para.kperiod,length(ind_fg));
- ERead = permute(ERead,[1,3,4,2]); % ->[ntSeg_cs,length(tsegs_st:tsegs_ed)/para.kperiod,length(ind_fg),para.kperiod/ntSeg_cs]
- ERead_cs = single(zeros(ntnC_cs,1,length(tsegs_st:tsegs_ed)/para.kperiod,length(ind_fg),para.kperiod/ntSeg_cs)); %[compressed#,comp.seg.,yxz_mask]
- % compress readout encoding matrix
- for idx_mod = 1:(para.kperiod/ntSeg_cs)
- E_seg = ERead(:,:,:,idx_mod);
- E_seg = reshape(E_seg,...
- ntSeg_cs,...
- 1,...
- length(tsegs_st:tsegs_ed)/para.kperiod,...
- length(ind_fg));
- E_seg = E_seg.*reshape(maps_SENSE,[1,nC,1,length(ind_fg)]);
- E_seg = reshape(E_seg,ntSeg_cs*nC,...
- 1,...
- length(tsegs_st:tsegs_ed)/para.kperiod,...
- length(ind_fg)); % [nToBeComps,1,sets of comp. matrix,different mod. periods,phase encoding]
- ERead_cs(:,:,:,:,idx_mod) = pagemtimes(matA(:,:,idx_mod),E_seg);
- end
- ERead_cs = permute(ERead_cs,[1,5,3,4,2]);
- ERead_cs = reshape(ERead_cs,ntnC_cs/ntSeg_cs*length(tsegs_st:tsegs_ed),length(ind_fg));
- % manage if total readout points before compression ~= integer x readout
- % segment points in a compression group
- if nGridMR~=length(tsegs_st:tsegs_ed)
- nRes_temp = (length(tsegs_st:tsegs_ed)-nGridMR)*nC/nJointCs;
- ERead_cs = ERead_cs(1:(end-nRes_temp),:);
- dat_exp_cs = reshape(dat_exp_cs,[],size(dat_exp_cs,5));
- dat_exp_cs = dat_exp_cs(1:(end-nRes_temp),:);
- end
- para.tcs_apply = toc(tstJointCs_apply);
- disp(['Time for applying compression matrices: ',num2str(para.tcs_apply),' s'])
- fprintf('\n')
- X = (['The (joint) compression matrices are applied, for compression factor: ',num2str(nC*ntSeg_cs/ntnC_cs)]);
- disp(X)
- fprintf('\n')
- clear ERead ; % save memory
- clear dat_exp;
- clear E_seg;
- nMR = size(ERead_cs,1);nC=1;% para.recnC=1;
- else
- % keep using ..._cs to be compatible with the joint compressed
- % variables
- ERead_cs = ERead; clear ERead;
- dat_exp_cs = dat_exp; clear dat_exp;
- end
- %% Reorganize data dimensions for compressed sensing recon. The implementation may be further optimized. For 2D CS, this is fine so far.
- disp('Reorganizes data dimensions for CS recon......')
- % Map compressed encoding matrix with only sampled phase encoded steps back
- % to the matrix that include the zero-zilled phase encoded steps
- ERead_full = single(zeros(size(ERead_cs,1),size(img_fg,1)*size(img_fg,2)*size(img_fg,3)));
- ERead_full(:,ind_fg) = ERead_cs;
- ERead_full = reshape(ERead_full,size(ERead_cs,1),size(img_fg,1),size(img_fg,2),size(img_fg,3));
- ERead_cs = ERead_full;clear ERead_full;
- fprintf('\n');
- mem_GB = size(ERead_cs,1)*size(img_fg,1)*size(img_fg,2)*size(img_fg,3)*8*1e-9;
- X = ['Composite readout matrix used for recon: ',num2str(mem_GB),'GB'];
- disp(X)
- % Prepare the adjoint encoding matrix for CS recon, to avoid regenerating it during iteration.
- ERead_cs_H = reshape(ERead_cs,size(ERead_cs,1),[]);
- ERead_cs_H = ERead_cs_H';
- ERead_cs_H = reshape(ERead_cs_H,size(img_fg,1),size(img_fg,2),size(img_fg,3),size(ERead_cs_H,2));
- ERead_cs_H = permute(ERead_cs_H,[1,4,2,3]);
- %% FISTA recon of joint encoding of rapid B0 modulation & SENSE
- % reshape data into 1D
- dat_exp_cs = dat_exp_cs(:);
- % Extract the max. eigenvalue for normalization. You may need to calculate
- % or empirically get one value for your dataset.
- norm_A = para.sReco;
- % normalization of readout encoding matrix
- L=1.1;
- ERead_cs = ERead_cs./norm_A;
- ERead_cs_H = ERead_cs_H./norm_A;
- % initialize variable
- u0 = single(zeros(length(ind_y),1));
- z0 = single(zeros(length(ind_y),1));
- t0 = single(1);
- % iteration step 40. empirical. you can tune it.
- nIter = 40;
- % Recon starts
- fprintf('\n');
- disp('Iterative FISTA reconstruction starts......')
- if bNLReco==1 % nonlinear regularization is applied
- ct_tv = 0;
- t_nl = tic;
- for idx_tv = lambda_TV
- ct_tv = ct_tv +1;
- ct_wave = 0;
- for idx_wave = lambda_walet % 2e-4 for level dependent
- ct_wave = ct_wave+1;
- for idx_Iter=1:nIter
- % FISTA iteration
- if idx_Iter == 1 % Take initialized values
- u_this = u0;
- z_this = z0;
- t_this = t0;
- else % Take updated values from the last iteration
- u_this = u_next;
- z_this = z_next;
- t_this = t_next;
- end
- img0 = Afun_NGSENSE_fft(dat_exp_cs,'transp',ERead_cs_H,sz_kmask,ind_k,ind_kx,ind_kz,sz_fg,ind_fg,ind_y,ind_x,ind_z);
- data_est = Afun_NGSENSE_fft(u_this,'notransp',ERead_cs,sz_kmask,ind_k,ind_kx,ind_kz,sz_fg,ind_fg,ind_y,ind_x,ind_z);
- img_est = Afun_NGSENSE_fft(data_est,'transp',ERead_cs_H,sz_kmask,ind_k,ind_kx,ind_kz,sz_fg,ind_fg,ind_y,ind_x,ind_z);
- [deri_TV,cost_TV] = apply_TV3D(u_this,sz_fg,ind_fg,idx_tv);
- grad = (1/L).*(img0-img_est);
- z_next = u_this+grad;
- z_next = z_next-(1/L).*deri_TV(img_fg==1);
- z_next = apply_Wavelet(z_next,size(img_fg),img_fg,bWaThres,idx_wave);
- z_next = z_next(img_fg==1);
- % Update the inversion time
- t_next = 0.5*(1+sqrt(1+4*t_this^2));
- % Update the input to the next FISTA iteration
- u_next = z_next + (t_this-1)/t_next*(z_next-z_this);
- end
- end
- end
- tdur_nl = toc(t_nl);
- fprintf('\n');
- disp(['Nonlinear recon takes total time: ',num2str(tdur_nl), 's']);
- recon_temp = single(zeros([nRecoPix_yx,nRecoPix_yx]));
- recon_temp(ind_fg) = u_next;
- recon = recon_temp;
- else % no nonlinear regularization is applied
- t_nl = tic;
- for idx_Iter=1:nIter
- % FISTA iteration
- if idx_Iter == 1 % Take initialized values
- u_this = u0;
- z_this = z0;
- t_this = t0;
- else % Take updated values from the last iteration
- u_this = u_next;
- z_this = z_next;
- t_this = t_next;
- end
- img0 = Afun_NGSENSE_fft(dat_exp_cs,'transp',ERead_cs_H,sz_kmask,ind_k,ind_kx,ind_kz,sz_fg,ind_fg,ind_y,ind_x,ind_z);
- data_est = Afun_NGSENSE_fft(u_this,'notransp',ERead_cs,sz_kmask,ind_k,ind_kx,ind_kz,sz_fg,ind_fg,ind_y,ind_x,ind_z);
- img_est = Afun_NGSENSE_fft(data_est,'transp',ERead_cs_H,sz_kmask,ind_k,ind_kx,ind_kz,sz_fg,ind_fg,ind_y,ind_x,ind_z);
- grad = (1/L).*(img0-img_est);
- z_next = u_this+grad;
- % Update the inversion time
- t_next = 0.5*(1+sqrt(1+4*t_this^2));
- %Update the input to the next FISTA iteration
- u_next = z_next + (t_this-1)/t_next*(z_next-z_this);
- end
- tdur_nl = toc(t_nl);
- fprintf('\n');
- disp(['L2 recon takes total time: ',num2str(tdur_nl), 's']);
- recon_temp = single(zeros([nRecoPix_yx,nRecoPix_yx]));
- recon_temp(ind_fg) = u_next;
- recon = recon_temp;
- end
- % Display the recon.
- figure
- imagesc(abs(rot90(recon,1)))
- colormap(gray)
- if bJointComp==1
- title(['2D CS recon, joint compress ',num2str(round(para.tcs_transformation+para.tcs_apply,1)),' s, recon ',num2str(round(tdur_nl,1)), ' s'])
- else
- title(['2D CS recon, RF compress ',num2str(round(para.tRFcs_transformation+para.tRFcs_apply,1)),' s, recon ',num2str(round(tdur_nl,1)), ' s'])
- end
- fprintf('\n');
- disp('This script only provides you a basic demo about the benefits of the joint compression technique.')
- disp('The implementation can be further optimized.')
Run_B0SENSE_recon.m at commit 9a7ecb0, under BSD-3-Clause · at the source
Overview
- High‐Field MR Center, Max Planck Institute for Biological Cybernetics Tübingen Germany
- Department for Biomedical Magnetic Resonance University of Tübingen Tübingen Germany
Abstract
Purpose: To accelerate MRI further, rapid B0 field modulations can be applied during oversampled readout to capture additional physical information, as in Wave‐CAIPI/
Theory and Methods: Because the rapid B0 modulations still vary slowly relative to the oversampled ADC dwell time, we exploit this encoding redundancy by compressing k‐space patch‐by‐patch across subregions, each of which is jointly encoded by a distinct subset of B0 and RF (receive) spatial encoding functions. For each subset, a compression matrix is computed once and reused to compress all patches encoded by the same B0‐RF spatial modulations. This can be implemented by feeding subsets of B0 and RF spatial encoding maps into an adapted conventional RF array compression algorithm, mimicking an expanded set of virtual receiver channels. This approach was evaluated on human brain scans at 9.4 T/
Results: The proposed group‐patch joint compression achieves substantially higher compression factors than conventional RF‐only compression, while minimally compromising encoding efficiency. Typically, joint compression factors of 11×–20× led to negligible encoding loss, dramatically reducing reconstruction time and peak memory usage. For example, compressed‐sensing reconstruction took 1.4–5.1 s/
Conclusion: Given joint encoding of dynamic B0 and static RF fields, compressing multidimensional k‐space patches in separate groups outperforms compressing RF receivers alone. This substantially mitigates a fundamental computational bottleneck when combining rapid B0 and RF‐receiver modulations.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 10 matches between paragraphs and lines of code.
Zenodo 20533698
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
ruitianwater/GroupPatchJCS_v1.0
9a7ecb08031b5f533870af47aee6527a51fedb18, 5 June 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
216 files
- Pulseq_sequence/
gradSpectrum_pulseq_fct_ , MATLAB, 193 linesMPITUB.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 95 linesmatlab/ +mr/ +Siemens/ readasc.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 187 linesmatlab/ +mr/ @EventLibrary/ EventLibrary.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 29 linesmatlab/ +mr/ @EventLibrary/ find_mat.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 2,037 linesmatlab/ +mr/ @Sequence/ Sequence.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 1,921 linesmatlab/ +mr/ @Sequence/ Sequence_old.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 156 linesmatlab/ +mr/ @Sequence/ calcPNS.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 524 linesmatlab/ +mr/ @Sequence/ read.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 182 linesmatlab/ +mr/ @Sequence/ readBinary.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 259 linesmatlab/ +mr/ @Sequence/ testReport.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 245 linesmatlab/ +mr/ @Sequence/ write.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 140 linesmatlab/ +mr/ @Sequence/ writeBinary.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 12 linesmatlab/ +mr/ Contents.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 200 linesmatlab/ +mr/ addGradients.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 66 linesmatlab/ +mr/ addRamps.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 74 linesmatlab/ +mr/ align.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 48 linesmatlab/ +mr/ block2events.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 52 linesmatlab/ +mr/ calcDuration.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 397 linesmatlab/ +mr/ calcRamp.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 62 linesmatlab/ +mr/ calcRfBandwidth.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 50 linesmatlab/ +mr/ calcRfCenter.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 89 linesmatlab/ +mr/ checkTiming.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 56 linesmatlab/ +mr/ compile_mex.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 61 linesmatlab/ +mr/ compressShape.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 18 linesmatlab/ +mr/ compressShape_mat.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 69 linesmatlab/ +mr/ convert.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 69 linesmatlab/ +mr/ decompressShape.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 10 linesmatlab/ +mr/ getSupportedLabels.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 6 linesmatlab/ +mr/ getSupportedRfUse.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 58 linesmatlab/ +mr/ makeAdc.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 260 linesmatlab/ +mr/ makeAdiabaticPulse.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 68 linesmatlab/ +mr/ makeArbitraryGrad.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 131 linesmatlab/ +mr/ makeArbitraryRf.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 84 linesmatlab/ +mr/ makeBlockPulse.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 14 linesmatlab/ +mr/ makeDelay.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 38 linesmatlab/ +mr/ makeDigitalOutputPulse.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 117 linesmatlab/ +mr/ makeExtendedTrapezoid.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 130 linesmatlab/ +mr/ makeExtendedTrapezoidAre a.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 126 linesmatlab/ +mr/ makeGaussPulse.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 38 linesmatlab/ +mr/ makeLabel.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 194 linesmatlab/ +mr/ makeSLRpulse.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 128 linesmatlab/ +mr/ makeSincPulse.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 164 linesmatlab/ +mr/ makeTrapezoid.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 39 linesmatlab/ +mr/ makeTrigger.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 117 linesmatlab/ +mr/ md5.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 62 linesmatlab/ +mr/ opts.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 27 linesmatlab/ +mr/ pts2waveform.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 46 linesmatlab/ +mr/ restoreAdditionalShapeSa mples.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 151 linesmatlab/ +mr/ rotate.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 16 linesmatlab/ +mr/ scaleGrad.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 135 linesmatlab/ +mr/ simRf.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 79 linesmatlab/ +mr/ splitGradient.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 132 linesmatlab/ +mr/ splitGradientAt.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 38 linesmatlab/ +mr/ traj2grad.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 177 linesmatlab/ demoRecon/ reconExample2DEPI.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 206 linesmatlab/ demoRecon/ reconExample2DFFT.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 177 linesmatlab/ demoRecon/ reconExample2DGD.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 175 linesmatlab/ demoRecon/ reconExample3DFFT.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 221 linesmatlab/ demoRecon/ reconExampleBART.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 98 linesmatlab/ demoRecon/ reconFID.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 118 linesmatlab/ demoSeq/ demoRead.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 172 linesmatlab/ demoSeq/ gre_live_demo.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 85 linesmatlab/ demoSeq/ gre_live_demo_step0.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 113 linesmatlab/ demoSeq/ pnsTest.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 250 linesmatlab/ demoSeq/ test.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 143 linesmatlab/ demoSeq/ writeCineGradientEcho.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 77 linesmatlab/ demoSeq/ writeEpi.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 223 linesmatlab/ demoSeq/ writeEpiDiffusionRS.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 242 linesmatlab/ demoSeq/ writeEpiRS.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 93 linesmatlab/ demoSeq/ writeEpiSpinEcho.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 204 linesmatlab/ demoSeq/ writeEpiSpinEchoRS.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 122 linesmatlab/ demoSeq/ writeEpi_label.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 39 linesmatlab/ demoSeq/ writeExternalFieldMap.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 125 linesmatlab/ demoSeq/ writeFastRadialGradientE cho.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 35 linesmatlab/ demoSeq/ writeFid.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 112 linesmatlab/ demoSeq/ writeGradientEcho.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 167 linesmatlab/ demoSeq/ writeGradientEcho3D.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 139 linesmatlab/ demoSeq/ writeGradientEcho_label. m - Pulseq_sequence/
pulseq-master/ , MATLAB, 124 linesmatlab/ demoSeq/ writeGradientEcho_rtian. m - Pulseq_sequence/
pulseq-master/ , MATLAB, 267 linesmatlab/ demoSeq/ writeHASTE.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 156 linesmatlab/ demoSeq/ writeMPRAGE.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 133 linesmatlab/ demoSeq/ writeMPRAGE_4ge.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 95 linesmatlab/ demoSeq/ writeRadialGradientEcho. m - Pulseq_sequence/
pulseq-master/ , MATLAB, 97 linesmatlab/ demoSeq/ writeSelectiveRf.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 181 linesmatlab/ demoSeq/ writeSemiLaser.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 180 linesmatlab/ demoSeq/ writeSpiral.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 269 linesmatlab/ demoSeq/ writeTSE.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 160 linesmatlab/ demoSeq/ writeTrufi.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 115 linesmatlab/ demoSeq/ writeUTE.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 155 linesmatlab/ demoSeq/ writeUTE_rs.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 277 linesmatlab/ demoSeq/ writeZTE_Petra.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 360 linesmatlab/ demoSeq/ writeZTE_Petra_Na.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 120 linesmatlab/ demoUnsorted/ demoRead.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 333 linesmatlab/ demoUnsorted/ demoRfSimulation.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 95 linesmatlab/ demoUnsorted/ gradSpectrum.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 118 linesmatlab/ demoUnsorted/ pnsTest.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 95 linesmatlab/ demoUnsorted/ rf_sim.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 103 linesmatlab/ demoUnsorted/ rf_simq.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 257 linesmatlab/ imab.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 52 linesmatlab/ make_all_docs.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 42 linesmatlab/ make_matlab_doc.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 43 linesmatlab/ parsemr.m - Pulseq_sequence/
pulseq-master/ , Python, 90 linesmatlab/ testmatlab.py - Pulseq_sequence/
pulseq-master/ , C++, 1,423 linessrc/ ExternalSequence.cpp - Pulseq_sequence/
pulseq-master/ , C/C++, 876 linessrc/ ExternalSequence.h - Pulseq_sequence/
pulseq-master/ , C++, 83 linessrc/ parsemr.cpp - Pulseq_sequence/
pulseq-master/ , Python, 40 linessrc/ testparser.py - Pulseq_sequence/
pulseq-master/ , MATLAB, 107 linestests/ epi_rs.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 27 linestests/ fid.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 19 linestests/ fiddisp.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 68 linestests/ gre.m - Pulseq_sequence/
pulseq-master/ , MATLAB, 15 linestests/ run_all.m - Pulseq_sequence/
writeWaveCAIPI.m , MATLAB, 281 lines, 2 matches - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 51 linesAfun_NGSENSE_fft.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 17 linesCompressRF.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 26 linesComputeMat_CSRF.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 529 lines, 3 matchesRun_B0SENSE_recon.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 11 linesToolbox/ @TV3D/ TV3D.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 4 linesToolbox/ @TV3D/ ctranspose.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 15 linesToolbox/ @TV3D/ mtimes.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 23 linesToolbox/ @TV3D/ private/ D.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 22 linesToolbox/ @TV3D/ private/ adjD.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 4 linesToolbox/ @TV3D/ times.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 23 linesToolbox/ @Wavelet/ Wavelet.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 4 linesToolbox/ @Wavelet/ ctranspose.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 13 linesToolbox/ @Wavelet/ mtimes.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 29 linesToolbox/ @Wavelet/ private/ DownDyadHi.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 30 linesToolbox/ @Wavelet/ private/ DownDyadLo.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 50 linesToolbox/ @Wavelet/ private/ FWT2_PO.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 49 linesToolbox/ @Wavelet/ private/ IWT2_PO.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 282 linesToolbox/ @Wavelet/ private/ MakeONFilter.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 32 linesToolbox/ @Wavelet/ private/ MirrorFilt.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 28 linesToolbox/ @Wavelet/ private/ SoftThresh.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 34 linesToolbox/ @Wavelet/ private/ UpDyadHi.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 33 linesToolbox/ @Wavelet/ private/ UpDyadLo.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 32 linesToolbox/ @Wavelet/ private/ UpSampleN.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 47 linesToolbox/ @Wavelet/ private/ aconv.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 46 linesToolbox/ @Wavelet/ private/ iconv.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 26 linesToolbox/ @Wavelet/ private/ lshift.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 37 linesToolbox/ @Wavelet/ private/ quadlength.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 27 linesToolbox/ @Wavelet/ private/ reverse.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 27 linesToolbox/ @Wavelet/ private/ rshift.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 7 linesToolbox/ @Wavelet/ private/ wavDenoise.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 17 linesToolbox/ @Wavelet/ private/ wavMask.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 13 linesToolbox/ @Wavelet/ times.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 19 linesToolbox/ SymFft.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 17 linesToolbox/ SymIfft.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 27 linesapply_TV3D.m - Recon/
2D_CS_LocalB0Coils_9T/ , MATLAB, 77 linesapply_Wavelet.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 55 linesAfun_NGSENSE_fft.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 527 lines, 2 matchesRun_B0SENSE_recon.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 11 linesToolbox/ @TV3D/ TV3D.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 4 linesToolbox/ @TV3D/ ctranspose.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 15 linesToolbox/ @TV3D/ mtimes.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 23 linesToolbox/ @TV3D/ private/ D.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 22 linesToolbox/ @TV3D/ private/ adjD.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 4 linesToolbox/ @TV3D/ times.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 23 linesToolbox/ @Wavelet/ Wavelet.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 4 linesToolbox/ @Wavelet/ ctranspose.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 13 linesToolbox/ @Wavelet/ mtimes.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 29 linesToolbox/ @Wavelet/ private/ DownDyadHi.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 30 linesToolbox/ @Wavelet/ private/ DownDyadLo.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 50 linesToolbox/ @Wavelet/ private/ FWT2_PO.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 49 linesToolbox/ @Wavelet/ private/ IWT2_PO.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 282 linesToolbox/ @Wavelet/ private/ MakeONFilter.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 32 linesToolbox/ @Wavelet/ private/ MirrorFilt.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 28 linesToolbox/ @Wavelet/ private/ SoftThresh.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 34 linesToolbox/ @Wavelet/ private/ UpDyadHi.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 33 linesToolbox/ @Wavelet/ private/ UpDyadLo.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 32 linesToolbox/ @Wavelet/ private/ UpSampleN.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 47 linesToolbox/ @Wavelet/ private/ aconv.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 46 linesToolbox/ @Wavelet/ private/ iconv.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 26 linesToolbox/ @Wavelet/ private/ lshift.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 37 linesToolbox/ @Wavelet/ private/ quadlength.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 27 linesToolbox/ @Wavelet/ private/ reverse.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 27 linesToolbox/ @Wavelet/ private/ rshift.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 7 linesToolbox/ @Wavelet/ private/ wavDenoise.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 17 linesToolbox/ @Wavelet/ private/ wavMask.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 13 linesToolbox/ @Wavelet/ times.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 19 linesToolbox/ SymFft.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 17 linesToolbox/ SymIfft.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 27 linesapply_TV3D.m - Recon/
3D_CS_Wave_9T_RAM1T/ , MATLAB, 75 linesapply_Wavelet.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 618 lines, 3 matchesRun_B0SENSE_recon.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 11 linesToolbox/ @TV3D/ TV3D.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 4 linesToolbox/ @TV3D/ ctranspose.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 15 linesToolbox/ @TV3D/ mtimes.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 23 linesToolbox/ @TV3D/ private/ D.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 22 linesToolbox/ @TV3D/ private/ adjD.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 4 linesToolbox/ @TV3D/ times.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 23 linesToolbox/ @Wavelet/ Wavelet.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 4 linesToolbox/ @Wavelet/ ctranspose.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 13 linesToolbox/ @Wavelet/ mtimes.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 29 linesToolbox/ @Wavelet/ private/ DownDyadHi.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 30 linesToolbox/ @Wavelet/ private/ DownDyadLo.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 50 linesToolbox/ @Wavelet/ private/ FWT2_PO.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 49 linesToolbox/ @Wavelet/ private/ IWT2_PO.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 282 linesToolbox/ @Wavelet/ private/ MakeONFilter.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 32 linesToolbox/ @Wavelet/ private/ MirrorFilt.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 28 linesToolbox/ @Wavelet/ private/ SoftThresh.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 34 linesToolbox/ @Wavelet/ private/ UpDyadHi.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 33 linesToolbox/ @Wavelet/ private/ UpDyadLo.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 32 linesToolbox/ @Wavelet/ private/ UpSampleN.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 47 linesToolbox/ @Wavelet/ private/ aconv.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 46 linesToolbox/ @Wavelet/ private/ iconv.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 26 linesToolbox/ @Wavelet/ private/ lshift.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 37 linesToolbox/ @Wavelet/ private/ quadlength.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 27 linesToolbox/ @Wavelet/ private/ reverse.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 27 linesToolbox/ @Wavelet/ private/ rshift.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 7 linesToolbox/ @Wavelet/ private/ wavDenoise.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 17 linesToolbox/ @Wavelet/ private/ wavMask.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 13 linesToolbox/ @Wavelet/ times.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 19 linesToolbox/ SymFft.m - Recon/
3D_L2_WaveCAIPI_3T/ , MATLAB, 17 linesToolbox/ SymIfft.m - LICENSE, License, 6 lines
- README.md, Text, 23 lines
harmonizedmri.github.io/projects
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 3 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 214 scripts, each with its path and the digest of its content;
- 10 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data Availability Statement
The example code or data that support the findings of this study is openly available in Zenodo at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 2, 28 September 2026
- Publisher: n/a → Wiley
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 2 authors, 6 keywords, 9 MeSH terms, 1 funder, 80 references.
Cite
This paper
Tian, R., & Scheffler, K. (2026). Group-Patch Joint Compression: Compressing Dynamic B&
BibTeX
@article{tian2026group,
author = {Tian, Rui and Scheffler, Klaus},
title = {{Group-Patch Joint Compression: Compressing Dynamic B\&
journal = {Magnetic resonance in medicine},
year = {2026},
month = jul,
volume = {96},
number = {5},
pages = {2106--2126},
publisher = {Wiley},
issn = {0740-3194},
doi = {10.1002/
url = {https://
pmid = {42490765},
pmcid = {PMC13527271}
}
RIS
TY - JOUR
AU - Tian, Rui
AU - Scheffler, Klaus
TI - Group-Patch Joint Compression: Compressing Dynamic B&
T2 - Magnetic resonance in medicine
J2 - Magn Reson Med
PY - 2026
DA - 2026/
VL - 96
IS - 5
SP - 2106
EP - 2126
SN - 0740-3194
PB - Wiley
DO - 10.1002/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1002/
"type": "article-journal",
"title": "Group-Patch Joint Compression: Compressing Dynamic B&
"container-title": "Magnetic resonance in medicine",
"author": [
{
"family": "Tian",
"given": "Rui"
},
{
"family": "Scheffler",
"given": "Klaus"
}
],
"container-title-short":
"volume": "96",
"issue": "5",
"page": "2106-2126",
"DOI": "10.1002/
"PMID": "42490765",
"PMCID": "PMC13527271",
"ISSN": "0740-3194",
"publisher": "Wiley",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
7,
23
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1002/mrm.70469 [code]
- Laterally Oscillating Trajectory for Undersampling Slices: LOTUS.Journal: Magnetic resonance in medicineIn common: Image Processing Toolbox, structural MRI / diffusion, 8 references
- [2] doi:10.1002/mrm.70433 [code]
- Single-Shot 2D Radial Echo Planar Imaging for Functional MRI.Journal: Magnetic resonance in medicineIn common: 5 references
- [3] doi:10.1002/mrm.70407 [code]
- Time-Conditioned Zero-Shot Self-Supervised Reconstruction for Accelerated 3D Ultra-Low-Field MRI.Journal: Magnetic resonance in medicineIn common: structural MRI / diffusion, 4 references
- [4] doi:10.1002/hbm.70553 [code]
- Axon Diameter Mapping in the Living Human Brain with Ultra-High-Gradient Diffusion MRI at 500 mT/
m Gradient Strength. Journal: Human brain mappingIn common: Image Processing Toolbox, structural MRI / diffusion, 3 references - [5] doi:10.1109/tmi.2026.3664328 [code]
- Axon Diameter Mapping From Myelin Water Diffusion MRI.Journal: IEEE transactions on medical imagingIn common: Image Processing Toolbox, structural MRI / diffusion, 3 references
- [6] doi:10.1002/mrm.70496 [code]
- A Deep Nonlinear Subspace Modeling and Reconstruction for Diffusion-Weighted Imaging Using Denoising Auto-Encoder.Journal: Magnetic resonance in medicineIn common: methods / tools, structural MRI / diffusion, 3 references
- [7] doi:10.1002/mrm.70490 [code]
- Dependence of the Extra-Cellular Diffusion Coefficient on the Fractions of Neurites and Cell Bodies in Gray Matter.Journal: Magnetic resonance in medicineIn common: structural MRI / diffusion, 3 references
- [8] doi:10.1002/nbm.70305 [code]
- Reducing Noise Induced by Cardiac Pulsatility in Brain Maps of R&
lt;sub& gt;2& lt;/ sub& gt;* and Magnetic Susceptibility Using Tailored k-space Sampling. Journal: NMR in biomedicineIn common: Image Processing Toolbox, structural MRI / diffusion, 2 references - [9] doi:10.7554/elife.92805 [code]
- Brain-wide mapping of layer-specific functional connectivity in the human cortex at 3T using draining-vein-suppressed
fMRI. Journal: eLifeIn common: Image Processing Toolbox, 2 references - [10] doi:10.1002/mrm.70416 [code]
- Fast and Robust Diffusion Posterior Sampling for MR Image Reconstruction Using the Preconditioned Unadjusted Langevin Algorithm.Journal: Magnetic resonance in medicineIn common: methods / tools, structural MRI / diffusion, 2 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 3 repositories of the authors' code, each at its verified commit and with its license, 214 scripts, and 10 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:2219b1bfa19e4c03…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
