Quindi mi sono chiesto per un po 'di tempo. Riassumendo su alcune variabile di matrice A
è facile comesomma MATLAB su tutti gli elementi di espressione con valore di matrice
sum(A(:))
% or
sum(...sum(sum(A,n),n-2)...,1) % where n is the dimension of A
Tuttavia una volta che si arriva alle espressioni della (:)
non funziona più, come
sum((A-2*A)(:))
non è la sintassi MATLAB valida, invece abbiamo bisogno di scrivere
foo = A-2*A;
sum(foo(:))
%or the one liner
sum(sum(...sum(A-2*A,n)...,2),1) % n is the dimension of A
l'uno di linea sopra funziona solo, se la dimensione di A è fisso, che, a seconda di cosa si sta facendo, non possono necessaria sii il caso Lo svantaggio delle due linee è, che foo sarà tenuto in memoria fino a quando non si esegue clear foo
o potrebbe non essere nemmeno possibile a seconda della dimensione di A e cos'altro è nel tuo spazio di lavoro.
Esiste un modo generale per aggirare questo problema e riassumere tutti gli elementi di un'espressione valutata con array in una singola riga/senza creare variabili temporali? Qualcosa come sum(A-2*A,'-all')
?
Edit: Si differes da How can I index a MATLAB array returned by a function without first assigning it to a local variable?, in quanto non riguarda in generale (e non specifico) l'indicizzazione di matrice valutate espressioni o valori restituiti, ma piuttosto la somma su ogni indice possibile.
Mentre è possibile risolvere il mio problema con la risposta fornita nel link, gnovice si dice che usare subref
è una soluzione piuttosto brutta. Andras Deak ha pubblicato un modo molto più pulito di fare ciò nei commenti qui sotto.
Perché sei così desideroso di evitare la variabile temporanea? Non ha importanza in termini di velocità e anche nessuno in termini di RAM (la stessa variabile verrebbe creata nella chiamata "somma"). Direi che 'sum (sum())' potrebbe essere più veloce, dal momento che rimodellare le matrici di grandi dimensioni richiede molto tempo. – Adriaan
@Daniel Credo che ci sia una semplice risposta a questa domanda che non riguarda il duplicato: 'sum (risagoma (A-2 * A, 1, []))'. Si prega di riaprire se si accetta in modo che io possa rispondere. –
@AndrasDeak Entrambe le versioni funzionano, ma la tua sembra molto più pulita che usare 'subref'. Vale la pena riaprire una domanda in questo caso? (Non sono sicuro del corretto codice di condotta qui.) –