我还在学习MATLAB中的一些高级功能。
我有一个2D矩阵,我希望对所有行求和,除了i。
例如
1 1 1
2 2 2
4 4 4
说我= 2,我想得到这个:
5 5 5
我可以通过对所有行求和,然后减去第i行来实现,但我想知道是否有更快的方法使用MATLAB的索引/选择语法。
答案 0 :(得分:7)
似乎将所有行相加,然后减去第i行,要快得多:
A=rand(500);
n = randi(500);
tic
for i=1:1e3
%sum(A([1:n-1 n+1:end], :));
sum(A)-A(n,:);
end
toc
Elapsed time is 0.162987 seconds.
A=rand(500);
n = randi(500);
tic
for i=1:1e3
sum(A([1:n-1 n+1:end], :));
end
toc
Elapsed time is 1.386113 seconds.
答案 1 :(得分:4)
添加以前作者的性能考虑因素。 nate的解决方案更快,因为它不使用第二种方法的复杂矩阵索引。复杂矩阵/向量索引is very inefficient in MATLAB。我怀疑索引的问题与引用问题中描述的问题相同。
按照以前的框架考虑以下简单测试:
A=rand(500);
n = randi(500);
tic
for i=1:1e3
B=sum(A(:, :));
end
toc
Elapsed time is 0.747704 seconds.
tic
for i=1:1e3
B=sum(A(1:end, :));
end
toc
Elapsed time is 5.476109 seconds. % What ???!!!
tic
id = [1:n-1 n+1:500];
for i=1:1e3
B=sum(A(id, :));
end
toc
Elapsed time is 5.449064 seconds.
答案 2 :(得分:3)
嗯,你可以这样做:
>> A = [ 1 1 1
2 2 2
4 4 4];
>> n = 2;
>> sum(A([1:n-1 n+1:end], :))
ans =
5 5 5
然而,正如Nate已经指出的那样,它看起来很漂亮,它实际上比仅减去我建议使用它的单行慢得多:)