4

私はまだ MATLAB の高度な機能のいくつかを学んでいます。

2D 行列があり、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

以前の作成者のパフォーマンスに関する考慮事項に追加します。2 番目の方法の複雑なマトリックス インデックスを使用しないため、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

ただし、ネイトがすでに示しているように、見た目は素晴らしいですが、実際には、単一の行を減算するよりもはるかに遅いので、使用しないことをお勧めします:)

于 2012-11-23T05:30:14.470 に答える