【问题标题】:Average part of a multidimensional array based on another array (Matlab)基于另一个数组的多维数组的平均部分(Matlab)
【发布时间】:2014-10-14 09:23:01
【问题描述】:
B = randn(1,25,10);
Z = [1;1;1;2;2;3;4;4;4;3];

好的,所以,我想找到 Z=1(或任何彼此相等的数字)的位置,然后在这些特定位置的 25 个点中的每一个上进行平均。在示例中,您将以 1*25*4 数组结尾。

有没有简单的方法来做到这一点?

我不是最精通 Matlab。

【问题讨论】:

  • 为什么不B = randn(10,25);?但无论哪种方式,您都可以通过创建一个逻辑索引向量开始,如下所示:Z == 1 以提取正确的4(虽然不应该是3??)第三维中的“列”
  • 是的,我可以取出第一个维度。我只是模拟了这个问题。 Z 的大小不是 10,它更像是 10,000,可能有 1000 个唯一值。我想我可以使用循环。

标签: matlab multidimensional-array average


【解决方案1】:

首要任务:分解问题。

  1. 定义组(即一组唯一的 Z 值)
  2. 查找属于这些组的元素
  3. 取平均值。

一旦你这样做了,你就可以开始看到它是一个非常标准的循环和“选择符合条件的列”。

类似的东西:

B = randn(1,25,10);
Z = [1;1;1;2;2;3;4;4;4;3];

groups = unique(Z); %//find the set of groups
C = nan(1,25,length(groups)); %//predefine the output space for efficiency
for gi = 1:length(groups) %//for each group
  idx = Z == groups(gi); %//find it's members
  C(:,:,gi) = mean(B(:,:,idx), 3); %//select and mean across the third dimension
end

【讨论】:

  • 看起来当我扩大规模时它会成功!非常感谢,艾伦!
  • 应该可以。虽然尝试优雅的单行解决方案可能很诱人,但有时最好坚持使用简单的 for 循环 - 特别是 matlab 可以自行优化这些解决方案。附带说明:如果有人能提醒我如何让 StackOverflow 识别 matlab 格式代码,我将不胜感激。
【解决方案2】:

如果B = randn(10,25); 则非常简单,因为 Matlab 函数通常在行中起作用。

使用逻辑索引:

ind = Z == 1;
mean(B(ind,:));

如果您要处理多个维度,请使用 permute(如果您实际上有 3 个或更多维度,请使用 reshape)来使您自己达到对上述行进行平均的程度:

B = randn(1,25,10);
BB = permute(B, [3,2,1])

如上继续

【讨论】:

    猜你喜欢
    • 2015-10-31
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多