在matlab

时间:2015-12-05 15:43:26

标签: matlab

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

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

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

2 个答案:

答案 0 :(得分:5)

注意:根据我帖子末尾的一些粗略基准,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,23来自zeeMonkeez' s解决方案)。

答案 1 :(得分:3)

在我的机器上,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那样为除数分配内存。