Matlab 在矩阵中插入和移动行

Matlab 在矩阵中插入和移动行,matlab,matrix,insert,Matlab,Matrix,Insert,根据MatlabProfiler,以下两个操作在我的代码中占用的时间最多 我有一个矩阵a,我总是保持固定大小(N行和2列)。我必须删除由两个实数组成的第一行,将所有行上移一,并插入[Inf]作为最后一行。我不明白为什么下面这行这么慢 A = [ A(2:end,:) ; [ Inf Inf ] ]; 我遇到的第二个问题是,当我同时需要在同一个矩阵a中插入一行并删除最后一行时。假设我想在行idx处插入row。接下来的一行会大大降低代码的速度 A = [ A(1:(idx - 1),:) ;

根据MatlabProfiler,以下两个操作在我的代码中占用的时间最多


我有一个矩阵a,我总是保持固定大小(
N
行和
2
列)。我必须删除由两个实数组成的第一行,将所有行上移一,并插入
[Inf]
作为最后一行。我不明白为什么下面这行这么慢

A = [ A(2:end,:) ; [ Inf Inf ] ];

我遇到的第二个问题是,当我同时需要在同一个矩阵a中插入一行并删除最后一行时。假设我想在行
idx
处插入
row
。接下来的一行会大大降低代码的速度

A = [ A(1:(idx - 1),:) ; row ; A(idx:(end - 1),:) ];


你知道为什么这两个类似的操作都很慢吗?我确实理解慢速是相对的,但这可能是因为此类操作不好,我可以改进它们。

这两种操作都会导致构建一个大小为nx2的新矩阵,并将旧矩阵的内容复制到新矩阵中。在这两种情况下,都会执行O(n)操作。这并不理想,尤其是在一个紧密的循环中


若你们对每一行数据都这样做,那个么这是一个O(nˆ2)操作。即使对于10k或100k这样的小型ns,您也会遇到问题。

热身后,对于您的第一个问题(2016a),这种速度在大多数情况下会快1.5-2倍


N的大小是多少?需要多少时间?这是否更快:
A(1:end-1)=A(2:end);A(结束:)=Inf
?i、 e.就地操作?您也可以尝试覆盖最后一行:
A=circshift(A,-1,1);A(完:)=Inf从一个非常快速的测试来看,它似乎比当前的&@Dan的方法快了约2倍。对于第二部分,我不理解为什么不能直接覆盖行:
A(idx,:)=row
N
是任意的,但不是很大,比如说10。但我不得不称之为10^6次。从一个非常简单的测试来看,@Dan的方法似乎并没有更快。我将尝试@excaza现在为第一部分提出的方法。对于第二部分,我无法覆盖该行,我需要通过将行
idx
或其上的所有行向上移动一行并丢弃最后一行来腾出空间。@ritz可能会解释为什么需要这样做,也许有办法完全避免这种情况?
N = 10;
M = rot90(blkdiag(rot90(eye(N-1)),inf),-1);
ind = 10000;
t = zeros(ind,1);
indarr = 1:ind;

for i = indarr
    A = rand(N,2);
    B = rand(N,2);

    tic,A = [ A(2:end,:) ; [ Inf Inf ] ];t1=toc;
    tic,B = M*B;t2 = toc;

    t(i) = t1-t2;
end

plot(t)