【问题标题】:running mean of a matrix in matlabmatlab中矩阵的运行平均值
【发布时间】:2015-12-06 01:42:04
【问题描述】:

给定 nxN 矩阵 A。我想找到矩阵行的运行平均值。为此我做了:

mean = cumsum(A, 2);
for k = 1:N
    mean(:, k) = mean(:, k)/k;
end

但是对于大 N 这需要一段时间。在 MATLAB 中有没有更有效的方法来做到这一点?

【问题讨论】:

  • mean 已经是一个函数,在命名变量时要小心与函数相同

标签: matlab


【解决方案1】:

注意: 根据我帖子末尾的一些粗略基准,zeeMonkeez 的解决方案是最快的。

怎么样

N = 1000;
A = rand(N, N);
m = cumsum(A, 2);
m1 = zeros(size(m));
tic
for j = 1:1000;
    for k = 1:N
        m1(:, k) = m(:, k)/k;
    end
end
toc

经过的时间是 6.971112 秒。

tic
for j = 1:1000
n = repmat(1:N, N, 1);
m2 = m./n;
end
toc

经过的时间是 2.471035 秒。

在这里,您将问题转换为矩阵乘法(而不是按元素划分,而是将一个矩阵除以另一个矩阵)。您想要除以的矩阵如下所示:

[1, 2, 3, ..., N;
 1, 2, .....
 .
 .
 1, 2, ....     ]

您可以使用repmat 获得。

编辑:基准

@zeeMonkeez 使用的 bsxfun 甚至更快。对于上述情况(我的系统上的差异为 10%)和更大的矩阵(N = 10000),在这种情况下,我的版本实际上表现最差(35 秒,OP 为 30 秒,zeeMonkeez 的解决方案为 23 秒)。

【讨论】:

    【解决方案2】:

    在我的机器上,bsxfun 更快:

    N = 1000;
    A = rand(N, N);
    m = cumsum(A, 2);
    
    tic
    for j = 1:1000;
        m2 = bsxfun(@rdivide, m, 1:N);
    end
    toc
    

    经过的时间:1.555507 秒。

    bsxfun 避免像repmat 那样为除数分配内存。

    【讨论】:

      猜你喜欢
      • 2018-12-02
      • 1970-01-01
      • 2011-10-21
      • 2013-09-23
      • 2013-06-16
      • 1970-01-01
      • 2012-05-06
      • 2014-03-16
      • 1970-01-01
      相关资源
      最近更新 更多