给定nxN矩阵A.我想找到矩阵行的运行平均值。为此,我做了:
mean = cumsum(A, 2);
for k = 1:N
mean(:, k) = mean(:, k)/k;
end
但是对于大N来说这需要一段时间。在MATLAB中有更有效的方法吗?
答案 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
那样为除数分配内存。