12

与えられたマトリックス:

A = [1 2 3; 4 5 6; 7 8 9];
  1. for ループを使用して、マトリックス内の要素の合計を計算するにはどうすればよいでしょうか?
  2. sumの行列要素を合計する関数を使用して、1 行の MATLAB コマンドを記述しAます。

私の答え:

1)

for j=1:3,
    for i=j:3,
        A(i,:) = A(i,:)+A(j+1,:)+A(j+2,:)
    end
end

2)

sum(A)

これらは正しい答えですか?if、 、 のwhile使い方がわかりませんでしたfor。誰かが私にそれを説明できますか?

4

6 に答える 6

18

1)

total = 0;
for i=1:size(A,1)
  for j=1:size(A,2)
    total = total + A(i,j);
  end
end

2)

total = sum(A(:));
于 2009-11-12T12:59:56.457 に答える
11

最初の質問に対する別の答えは、1の for ループを使用し、関数NUMELを使用して配列に線形インデックスを実行して要素の総数を取得することです。

total = 0;
for i = 1:numel(A)
  total = total+A(i);
end
于 2009-11-12T15:10:49.327 に答える
3

可能な限り for ループを避けてください。

sum(A(:))

素晴らしいですが、論理インデックス作成が行われている場合は、(:) を使用できませんが、次のように記述できます

% Sum all elements under 45 in the matrix
sum ( sum ( A *. ( A < 45 ) )

sum は列を合計し、最初の合計によって作成された行ベクトルを合計するためです。これは、マトリックスが 2 次元の場合にのみ機能することに注意してください。

于 2011-07-15T14:39:13.307 に答える
2

ベスト プラクティスは、Matlab でループや再帰を避けることです。

sum(A(:))との間sum(sum(A))。私の経験では、Matlab の配列は、スタックされた列ベクトルとしてメモリ内の連続ブロックに格納されているようです。したがって、 A の形状は ではあまり重要ではありませんsum()reshape()( Matlab で再形成が高速かどうかをテストして確認できます。高速である場合、配列の形状がデータの保存方法と操作方法に直接関係していないと考える理由があります。)

そのため、sum(sum(A))高速にする必要はありません。Matlab が実際に A の各列の合計を記録する行ベクトルを最初に作成し、次に列の合計を作成すると、処理が遅くなります。しかし、私sum(sum(A))はユーザーの間で非常に広まっていると思います。sum(sum(A))と同じように、単一のループになるようにハードコーディングされている可能性がありsum(A(:))ます。

以下に、いくつかのテスト結果を示します。各テストでは、A=rand(サイズ) とサイズが表示されたテキストで指定されます。

まずはtic tocの使い方です。

Size 100x100
sum(A(:))
Elapsed time is 0.000025 seconds.
sum(sum(A))
Elapsed time is 0.000018 seconds.

Size 10000x1
sum(A(:))
Elapsed time is 0.000014 seconds.
sum(A)
Elapsed time is 0.000013 seconds.

Size 1000x1000
sum(A(:))
Elapsed time is 0.001641 seconds.
sum(A)
Elapsed time is 0.001561 seconds.

Size 1000000
sum(A(:))
Elapsed time is 0.002439 seconds.
sum(A)
Elapsed time is 0.001697 seconds.

Size 10000x10000
sum(A(:))
Elapsed time is 0.148504 seconds.
sum(A)
Elapsed time is 0.155160 seconds.

Size 100000000
Error using rand
Out of memory. Type HELP MEMORY for your options.

Error in test27 (line 70)
A=rand(100000000,1);

以下はcputimeを使用しています

Size 100x100
The cputime for sum(A(:)) in seconds is 
0
The cputime for sum(sum(A)) in seconds is 
0

Size 10000x1
The cputime for sum(A(:)) in seconds is 
0
The cputime for sum(sum(A)) in seconds is 
0

Size 1000x1000
The cputime for sum(A(:)) in seconds is 
0
The cputime for sum(sum(A)) in seconds is 
0

Size 1000000
The cputime for sum(A(:)) in seconds is 
0
The cputime for sum(sum(A)) in seconds is 
0

Size 10000x10000
The cputime for sum(A(:)) in seconds is 
0.312
The cputime for sum(sum(A)) in seconds is 
0.312

Size 100000000
Error using rand
Out of memory. Type HELP MEMORY for your options.

Error in test27_2 (line 70)
A=rand(100000000,1);

私の経験では、どちらのタイマーも 0.1 秒までしか意味がありません。したがって、Matlab タイマーで同様の経験がある場合、どのテストでも と を識別できませsum(A(:))sum(sum(A))

コンピューターで許可されている最大サイズをさらに数回試しました。

Size 10000x10000
sum(A(:))
Elapsed time is 0.151256 seconds.
sum(A)
Elapsed time is 0.143937 seconds.

Size 10000x10000
sum(A(:))
Elapsed time is 0.149802 seconds.
sum(A)
Elapsed time is 0.145227 seconds.

Size 10000x10000
The cputime for sum(A(:)) in seconds is 
0.2808
The cputime for sum(sum(A)) in seconds is 
0.312

Size 10000x10000
The cputime for sum(A(:)) in seconds is 
0.312
The cputime for sum(sum(A)) in seconds is 
0.312

Size 10000x10000
The cputime for sum(A(:)) in seconds is 
0.312
The cputime for sum(sum(A)) in seconds is 
0.312

それらは同等に見えます。どちらでもいいです。ただしsum(sum(A))、配列の次元が 2 であることを知っている必要があります。

于 2014-04-08T06:22:50.000 に答える
0

2-D Array のすべての要素を合計しようとしています

Matlabでの使用

Array_Sum = sum(sum(Array_Name));

于 2014-04-01T15:36:36.980 に答える