1

Ok so I have an array <134x106x108>. What I'm trying to do is loop through this array and store the average/standard deviation into another array. So basically there will be 134 <106x108 doubles> that will be in this meanArray and sdArray.

 %dayv=<134x106x108>
 sdArray=zeros(1,106,108);
 meanArray=zeros(1,106,108);
for i=1:size(dayv,1)
    %store means/standard deviation into an array
    meanArray(i,:,:) = squeeze(mean(dayv(i,:,:)));
    sdArray(i,:,:) = squeeze(std(dayv(i,:,:)));
end
4

2 回答 2

4

如果您希望您的每一种方法都是整个 106x108 矩阵的平均值,那么一个简单的解决方案是使用以下方法将您的 3d 矩阵重塑为 2d 矩阵,

dayv2 = reshape(dayv,[134 106*108]);

现在,这些 106x108 矩阵中的每一个都是新矩阵中的行向量。

然后

meanArray = mean(dayv2,2); % Get mean of each row
stdArray  = std(dayv2,0,2);% Std of each row
于 2012-11-28T20:38:17.030 回答
3

您不需要使用循环来解决此问题。matlab 内置函数meanstd能够沿矩阵的各个维度进行计算:

meanArray = squeeze(mean(dayv, 1));
sdArray = squeeze(std(dayv, [], 1));

当您在代码中初始化时,上面的代码将沿第一个维度进行平均,并产生一个106x108 的meanArray和。sdArray另一方面,如果您想要meanArray并且sdArray是长度为 134 的一维向量(正如您的循环所暗示的那样),您会这样做

meanArray = mean( mean(dayv, 3), 2 );
sdArray = squeeze(std( reshape( dayv,  134, [] ), [], 2 ));

wherereshape重新组织您的矩阵,使其为 134x(106*108),以便std可以正确处理它。

您可以将上述方法与基于 for 循环的代码进行比较:

for i=1:size(dayv,1)
  slice = squeeze(dayv(i,:,:));
  meanArray(i) = mean(slice(:));
  sdArray(i) = std(slice(:));
end
于 2012-11-28T20:16:31.143 回答