matlab for loop:重现大矩阵的最快,最有效的方法

时间:2012-06-11 07:19:47

标签: performance matlab loops for-loop copy

我的数据是double值的2096x252矩阵。我需要for循环或执行以下操作的等效循环:
每次再现矩阵时,第一个数组被删除,第二个数据成为第一个数组。当循环再次运行时,剩余的矩阵被重现并删除第一个数组,下一个数组成为第一个,依此类推。 我尝试过使用repmat,但在处理大型矩阵(2096x252)时,它太慢而且乏味。

示例输入:

1 2 3 4
3 4 5 6
3 5 7 5
9 6 3 2

期望的输出:

1 2 3 4
3 4 5 6
3 5 7 5
9 6 3 2
3 4 5 6
3 5 7 5
9 6 3 2
3 5 7 5
9 6 3 2
9 6 3 2

2 个答案:

答案 0 :(得分:2)

通常使用Matlab,预分配大型数组要比增量式构建要快得多。当你事先知道大阵列的最终尺寸时,没有理由不遵循这个一般性的建议。

像下面这样的东西应该做你想要的。假设你有一个数组in(nrows, ncols);然后

indices = [0 nrows:-1:1];
out = zeros(sum(indices),ncols);
for ix = 1:nrows
    out(1+sum(indices(1:ix)):sum(indices(1:ix+1)),:) = in(ix:end,:);
end

这适用于您的小测试输入。我希望你能弄明白发生了什么。

它是否是我不知道的所有可能方法中最快的方法,但我希望它比逐步构建大型矩阵要快得多。

答案 1 :(得分:1)

<强>声明:
你可能会遇到大型矩阵的内存问题,但这不是问题。

现在,对业务:
对于给定的矩阵A,使用for循环的简单方法是:

[N, M] = size(A);
B = zeros(sum(1:N), M);
offset = 1;
for i = 1:N
    B(offset:offset + N - i, :) = A(i:end, :);
    offset = offset + size(A(i:end, :), 1);
end

B是所需的输出矩阵 但是,由于for循环,预计此解决方案也会很慢。

修改:预分配B而非动态更改大小(此优化应实现轻微加速)。