好的,我有一个阵列< 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
答案 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内置函数mean
和std
能够沿矩阵的各个维度进行计算:
meanArray = squeeze(mean(dayv, 1));
sdArray = squeeze(std(dayv, [], 1));
以上代码将沿第一维平均,并在您的代码中初始化时生成106 {108}的meanArray
和sdArray
。另一方面,如果您希望meanArray
和sdArray
是长度为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