Was sind die Möglichkeiten Matrixelemente in MATLAB zu fassen?

stimmen
11

Angesichts der Matrix:

A = [1 2 3; 4 5 6; 7 8 9];
  1. Wie könnte man eine for-Schleife verwenden, um die Summe der Elemente in der Matrix zu berechnen?
  2. Schreibe eine eine Zeile MATLAB - Befehl unter Verwendung der Funktion sumin der Matrix - Elemente zu summieren A.

Meine Antwort:

1)

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

2)

sum(A)

Sind das die richtigen Antworten? Ich wusste nicht , wie zu bedienen if, whileund for. Kann jemand es mir erklären?

Veröffentlicht am 12/11/2009 um 13:52
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
26

Für sehr große Matrizen sum(sum(A))kann schneller sein als sum(A(:)):

>> A = rand(20000);
>> tic; B=sum(A(:)); toc; tic; C=sum(sum(A)); toc
Elapsed time is 0.407980 seconds.
Elapsed time is 0.322624 seconds.
Beantwortet am 08/10/2013 um 15:46
quelle vom benutzer

stimmen
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(:));
Beantwortet am 12/11/2009 um 13:59
quelle vom benutzer

stimmen
10

Eine andere Antwort auf die erste Frage ist , zu verwenden , eine für die Schleife und führen lineare Indexieren in die Anordnung mit der Funktion Numel die Gesamtzahl von Elementen zu erhalten:

total = 0;
for i = 1:numel(A)
  total = total+A(i);
end
Beantwortet am 12/11/2009 um 16:10
quelle vom benutzer

stimmen
3

Vermeiden Sie für Schleifen, wann immer möglich.

sum(A(:))

jedoch ist groß, wenn Sie einige logische Indizierung auf Sie gehen haben, können nicht die (:) verwenden, aber Sie können schreiben

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

Da Summe summiert die Spalten und summiert den Zeilenvektor, der von der ersten Summe erstellt wurde. Beachten Sie, dass dies nur funktioniert, wenn die Matrix 2-dim ist.

Beantwortet am 15/07/2011 um 15:39
quelle vom benutzer

stimmen
1

Am besten ist es auf jeden Fall Schleifen oder Rekursion in Matlab zu vermeiden.

Zwischen sum(A(:))und sum(sum(A)). Nach meiner Erfahrung Arrays in Matlab scheint in einem kontinuierlichen Block im Speicher als gestapelte Spaltenvektoren gespeichert werden. So die Form eines nicht ganz in der Materie sum(). (Man kann testen reshape()und prüfen , ob Umbildung in Matlab schnell ist. Wenn ja, dann haben wir einen Grund zu der Annahme , dass die Form eines Arrays nicht direkt auf die Art und Weise aus den Daten gespeichert und manipuliert werden kann .)

Als solche gibt es keinen Grund , sum(sum(A))schneller sein sollte. Es wäre langsamer , wenn Matlab schafft tatsächlich einen Zeilenvektor die Summe jeder Spalte einer ersten und dann Summe über die Spalten der Aufnahme. Aber ich denke , sum(sum(A))ist sehr weit verbreitet unter den Nutzern. Es ist wahrscheinlich , dass sie hart Code sum(sum(A))eine einzelne Schleife zu sein, das gleiche zu sum(A(:)).

Im Folgenden werde ich bieten einige Testergebnisse. Bei jedem Test A = rand (Größe) und die Größe in den angezeigten Texten angegeben.

Zunächst wird mit 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);

Im Folgenden wird mit 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);

Meiner Erfahrung nach sind beide Timer nur dann sinnvoll bis zu .1s. Also , wenn Sie ähnliche Erfahrung mit Matlab - Timer haben, keiner der Tests kann erkennen sum(A(:))und sum(sum(A)).

Ich habe versucht, die größte Größe erlaubt auf meinem Computer ein paar Mal.

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

Sie scheinen gleichwertig. Entweder man ist gut. Aber es sum(sum(A))erforderlich , dass Sie die Dimension Ihrer Array wissen 2 ist.

Beantwortet am 08/04/2014 um 07:22
quelle vom benutzer

stimmen
0

Sie versuchen, alle Elemente der 2-D-Array zusammenzufassen

In Matlab Verwendung

Array_sum = Summe (sum (Array_Name));

Beantwortet am 01/04/2014 um 16:36
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more