0

我的数据是一个 2096x252 的double值矩阵。我需要一个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
4

2 回答 2

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

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

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

于 2012-06-11T09:26:09.540 回答
1

免责声明:
您可能会遇到大型矩阵的内存问题,但这不是问题所在。

现在,对于业务:
对于给定的 matrix ,使用循环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而不是动态改变大小(这种优化应该会实现轻微的加速)。

于 2012-06-11T09:25:39.230 回答