循环通过3D阵列找到平均值和标准差

时间:2012-11-28 20:09:48

标签: arrays matlab octave mean

好的,我有一个阵列< 134x106x108>。我要做的是循环遍历此数组并将平均值/标准差存储到另一个数组中。所以基本上会有134< 106x108双打>这将意味着阿雷和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

2 个答案:

答案 0 :(得分:4)

如果您希望每种方法都是整个106x108矩阵的平均值,那么一个简单的解决方案就是使用

将3d矩阵重塑为二维矩阵
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

答案 1 :(得分:3)

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

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

以上代码将沿第一维平均,并在您的代码中初始化时生成106 {108}的meanArraysdArray。另一方面,如果您希望meanArraysdArray是长度为134的单维向量(如循环所暗示的那样),那么您可以

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

其中reshape重新组织您的矩阵,使其为134x(106 * 108),以便std可以正确地对其进行操作。

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

for i=1:size(dayv,1)
  slice = squeeze(dayv(i,:,:));
  meanArray(i) = mean(slice(:));
  sdArray(i) = std(slice(:));
end