2017-04-02 6 views
1

Ich habe 100 dünn besetzte Matrizen der Größe N-by-N, wo N=65536.Summe über Zell-Array von dünn besetzten Matrizen

Sie haben ungefähr 5.5M Nicht-Null-Elemente (0.13% von N^2) in der Nähe der Diagonalen.

Sie sind in einem Zellenfeld gespeichert, S{1}, ... , S{100}, und ich möchte die Summe S{1}+...+S{100} berechnen.

Sum=sparse(N,N); 
for i=1:100 
    Sum=Sum+S{i}; 
end 

Der obige for Schleifencode dauerte etwa 25 Sekunden. Gibt es eine Möglichkeit, diesen Code zu optimieren?

Antwort

2

verwenden diese keine Schleifen, und die Matrizen in voller vermeidet Umwandlung auch:

[ii, jj, vv] = find(vertcat(S{:})); % concatenate matrices vertically. 
    % Get nonzero values (vv) with their row (ii) and column (jj) indices 
ii = mod(ii-1, N) + 1; % convert ii to original row indices 
Sum = sparse(ii, jj, vv); % this automatically adds values at the same ii, jj 
+0

Dieser Code sieht gut aus. Aber in meinem Computer dauerte die erste Zeile 200 Sekunden, und die letzte Zeile dauerte 450 Sekunden und wurde dann wegen Speichermangels gestoppt. :( – Gobi

Verwandte Themen