Extract subset of time-curves from a 4D volume

1 view (last 30 days)
Dear all,
I have a 4D volume and I can easily extract the temporal curve for each voxel.
I would like to extract only the curves for the voxels that correspond to a certain condition.
For example: V is the 4D volume and R is a 3D mask volume. I would like to extract only the curves of the points in which R>0 but without using a for cicle.
Normally I would write:
for k=1:size(V,3)
for i=1:size(V,1)
for j =1:size(V,2)
if (R(i,j,k)>0)
y = squeeze(V(i,j,k,:));
a(i,:) = y;
......
end
end
end
I tried to use indexing but I can only use it with 3D volumes.
Is there an efficient solution (I mean fast) to do this?
Thanks a lot
  4 Comments
Turlough Hughes
Turlough Hughes on 10 Jun 2020
You could do something like this.
V2 = V; % make a copy of V
V2(repmat(R<=0,1,1,1,size(V2,4)))=NaN; % Remove values where R <= 0
My feeling is that you should maintain the shape of V, so I opted to insert NaN's at coordinates where your condition R>0 is false, ie where R<=0 is true. Is that the sort of answer you're looking for?
Domenico
Domenico on 10 Jun 2020
Thanks a lot.
In this way you obtain a sort of "masking" of the 4D volume, right? From that masking, however, I would like to extract each single temporal 1D curve, i.e. for every survived pixel I would like to obtain its curve (without using for)

Sign in to comment.

Accepted Answer

Turlough Hughes
Turlough Hughes on 17 Jun 2020
I can reduce this to a single for loop which iterates through the timesteps but i'm not sure about doing this entirely without loop. Here, I concatentate the data of a given timestep into a column vector and insert it into results. I took the liberty of including the x,y and z indices in columns 1,2 and 3, respectively, so each timestep is added sequentially thereafter.
Rmask = R>0; % Binary mask
[Ix, Iy, Iz] = ind2sub(size(Rmask),find(Rmask)); % get x,y,z indices for mask
result = [Ix, Iy, Iz, zeros(numel(Ix),size(V,4))]; % preallocate space
for t = 1:size(V,4)
Vtemp = V(:,:,:,t); % grab one timestep
result(:,t+3) = Vtemp(Rmask); % Convert to column vector and insert into results
end
  7 Comments
Domenico
Domenico on 17 Jun 2020
Ok, only a question: what do you do with Ixyz? You obtain it but you don't use it for Vr. Is right?
Turlough Hughes
Turlough Hughes on 17 Jun 2020
Ixyz is the corresponding index in V. The first row of Vr shows values changing over time at a single point within V, the first row of Ixyz inidicates the corresponding xyz indices within V which can usually be related to an xyz position. I just assumed you would need it.

Sign in to comment.

More Answers (0)

Categories

Find more on Matrices and Arrays in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!