在矩阵

时间:2016-05-26 12:45:58

标签: matlab matrix insert

根据Matlab分析器,以下两个操作在我的代码中花费的时间最多。

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

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

我遇到的第二个问题是当我同时需要在同一个矩阵A中插入一行并删除最后一行时。我们假设我想在行row处插入idx。然后,以下行显着减慢了代码。

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

知道为什么两个类似的操作都很慢?我确实知道慢是相对的,但可能是这种操作是不好的做法,我可以改进它们。

2 个答案:

答案 0 :(得分:1)

这两个操作都会导致构建一个大小为nx2的新矩阵,并将旧的矩阵复制到新的矩阵中。在这两种情况下都完成了O(n)操作。这并不理想,特别是在紧凑的循环中。

如果你对数据的每一行都这样做,那就是O(n2)操作。即使是像10k或100k这样的小ns,你也会遇到问题。

答案 1 :(得分:1)

在热身之后,对于你的第一个问题(2016a),这种情况在大多数情况下大多数时间增加1.5-2倍。

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)