3-Dimensional Matrix and Standard Deviation

Hi there,
I have a 3-Dimensional matrix (sizeX, sizeY, 700 Frames). I would like to group the "frames" in groups of 10, so that I can take the standard deviation of each of these groups of frames. E.g. -- Since I have 700 frames (z values), I would like to take the standard deviation of 1:10, then 11:20, then 21:30. For mean, I could just bin them in groups of ten (using for loop and mean function) and get my 70 values. But for standard deviation, I'm not sure how to do this.

2 commentaires

Sami Case
Sami Case le 23 Mai 2021
**Similar to the Grouped-Z Project function in ImageJ where you can do Standard Deviation of your data with a group size of 10.
Sami Case
Sami Case le 25 Mai 2021
See DGM’s comment below for answer help.

Connectez-vous pour commenter.

 Réponse acceptée

Hi,
Here is a relatively simple solution for the standard deviation calculation:
D = DATA; % DATA of size: X-by-Y-Zs, where Zs = 1:700;
IND = 1:10:700;
for ii=2:numel(IND)
S_D(ii-1) = std2(D(:,:,IND(ii-1):IND(ii))); % Standard deviation
M_D(ii-1)=mean2(D(:,:, IND(ii-1):IND(ii))); % Mean values
end
Good luck.

4 commentaires

Sami Case
Sami Case le 23 Mai 2021
Modifié(e) : Sami Case le 23 Mai 2021
This is returning a 1x70 vector, I was wanting to have a standard deviation for each pixel (160 x 160) based on 10 frame bins. So the dimensions of the output would be 160x160x70. Any help?
It is quite simple:
...
IND = 0:10:700;
IND(1)=1;
for ii = ... % the rest is the same
...
Good luck.
Sami Case
Sami Case le 23 Mai 2021
This is still showing a 1x70 vector. My goal it to have a standard deviation from 1-70 for each cell in the matrix. So my matrix is 160-by-160 and the z is 700. I would like to have a standard deviation of the cell in column 1, row 1 for every z. And for column 2, row 2 for every z. The output should be 160 by 160 by 70 matrix.
DGM
DGM le 24 Mai 2021
Modifié(e) : DGM le 24 Mai 2021
Try this:
D = rand(10,10,100); % random sample data
blocksize = 10; % how many pages to collapse?
npages = size(D,3);
IND = 1:blocksize:npages;
stdpict = zeros(size(D,1),size(D,2),numel(IND));
meanpict = zeros(size(D,1),size(D,2),numel(IND));
for ii=1:numel(IND)
idxrange = IND(ii):(IND(ii)+blocksize-1);
% Standard deviation of block along dim 3
stdpict(:,:,ii) = std(D(:,:,idxrange),0,3);
% Mean of block along dim 3
meanpict(:,:,ii) = sum(D(:,:,idxrange),3)/blocksize;
end
% the indexing will break if npages is not integer-divisible by blocksize
This does operations along dim3 of each block of pages. That sounds like what you're after.
Prior code was also indexing 1:11, 11:21, 21:31, etc, and dropping the last sample block.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by