【问题标题】:Looping through a 3D array to find the mean and standard deviation循环遍历 3D 数组以找到均值和标准差
【发布时间】:2012-11-16 19:19:09
【问题描述】:

好的,所以我有一个数组 。我想要做的是遍历这个数组并将平均值/标准偏差存储到另一个数组中。所以基本上会有 134 个 在这个 meanArray 和 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

【问题讨论】:

  • 那么,您希望每个平均值都是整个 106x108 值的平均值吗?
  • @jerad 是的,这就是我想要的。所以这是一系列手段,但我将拥有其中的 134 种。

标签: arrays matlab octave mean


【解决方案1】:

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

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

当您在代码中初始化时,上述代码将沿第一个维度进行平均,并生成大小为 106x108 的 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

【讨论】:

  • 那么我如何获得 134 个平均值?如果我只是做av=squeeze(mean(dayv,1)); 它会返回一个 .
【解决方案2】:

如果您希望您的每一种方法都是整个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多