4

我仍在学习 MATLAB 中的一些高级功能。

我有一个二维矩阵,我想对所有行求和,除了 i。

例如

1 1 1
2 2 2
4 4 4

说 i = 2,我想得到这个:

5 5 5

我可以通过对所有行求和,然后减去第 i 行来做到这一点,但我想知道是否有更快的方法使用 MATLAB 的索引/选择语法。

4

3 回答 3

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.
于 2012-11-23T07:01:07.760 回答
4

增加以前作者的性能考虑。nate 的解决方案更快,因为它不使用第二种方法的复杂矩阵索引。复杂的矩阵/向量索引在 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.
于 2012-11-23T08:11:42.213 回答
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 已经指出的那样,尽管它看起来不错,但它实际上比仅减去我建议不要使用它的单行要慢得多:)

于 2012-11-23T05:30:14.470 回答