【问题标题】:Averaging every 10 numbers in a matrix in MatlabMatlab中矩阵中每10个数字的平均值
【发布时间】:2018-11-19 13:08:18
【问题描述】:

如何获取大矩阵 (27x16800) 中每 10 个数字的平均值。 我找不到解决方案 如果有人可以提供帮助,那就太好了。

UPD 抱歉,我应该说得更清楚些。我有 27 个科目的记录值矩阵 (16800)。每个主题对应行;我想得到一个由 27 个主题组成的新矩阵,每行平均有 1680 个数字(而行中的每个“旧”10 个数字将被平均为 1 个“新”平均数)。

【问题讨论】:

  • “每10个数字”在什么方向?您预期的输出大小是多少?你想如何处理第一个和最后 9 个数字,它们周围没有 10 个数字?请告诉我们minimal reproducible example,让这个问题更清楚。
  • 嗨@Vitto! “每十个数字”到底是什么意思?沿行?沿着列?
  • 对不起,我应该更清楚。我有 27 个科目的记录值矩阵 (16800)。每个主题对应于行,我想得到一个包含 27 个主题的新矩阵,平均数为 1680(而行中的每个“旧”10 个数字将平均为 1 个“新”平均数)
  • 您可能想要n = 10; result = permute(mean(reshape(x.', n, [], size(x,1)), 1), [3 2 1]); 其中x 是数据矩阵
  • 路易斯,非常感谢!这正是我所需要的。

标签: matlab matrix average


【解决方案1】:

给定一个随机数据矩阵x

x = randn(27,16800);

您可以使用 cmets 中 Luis MendoBrice 所描述的两种类似方式计算沿行的所有 n=10 值组的平均值:

y = permute(mean(reshape(x.', n, [], size(x,1)), 1), [3 2 1]); % Luis
y = squeeze(mean(reshape(x,size(x,1),n,[]),2));                % Brice

但是,正如 Wolfie 所指出的,这些只有在行的长度可以被 n 整除时才有效。

通过卷积可以获得更通用的方法:

y = conv2(x,ones(1,n)/n,'valid');
y = y(:,1:n:end);

卷积输出中的每个矩阵元素都是n 值的平均值。此结果比输入短 n-1 个元素。也就是说,我们计算了n 倍于所需的平均值。第二行取每个n 的第一个平均值,产生预期大小的输出。

卷积产生的结果与其他方法的数值不精确性不同(在我的机器上最大差异为 4.4409e-16)。这是因为 conv2 是使用 CPU 的 SIMD 指令实现的,而 mean 可能不是。卷积方法可能比其他方法慢一些,但它是通用的且易于适应。

【讨论】:

  • Cris Luengo,非常感谢您的详细解释!
猜你喜欢
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 2013-09-23
  • 1970-01-01
  • 2018-08-05
  • 2011-10-21
  • 1970-01-01
  • 2021-10-29
相关资源
最近更新 更多