根据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),:) ];
知道为什么两个类似的操作都很慢?我确实知道慢是相对的,但可能是这种操作是不好的做法,我可以改进它们。
答案 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)