我的数据是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
答案 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
而非动态更改大小(此优化应实现轻微加速)。