Domanda

Sto cercando di trovare un modo per approfondire una dimensione 3 vettore da ogni colonna di una matrice di 3 * (un grande numero) in Matlab.Certo che potrei usare un anello, ma sto cercando di trovare una soluzione più efficiente, un po 'come una trasmissione misputa.Oh, e non posso usare il repmat perché non ho abbastanza memoria per usarlo (come crea ancora un altro 3 * (un grande numero) matrice) ...

è possibile?

È stato utile?

Soluzione

Loops non è più cattivo a Matlab grazie ad ottimizzazioni del compilatore come solo-In-time acceleration (JITA) .ecc. La maggior parte delle volte, ho notato che una soluzione con i loop nelle attuali versioni Matlab è molto più veloce rispetto a complicato (anche se, fresco: D) one-liner.

bsxfun potrebbe fare il trucco Ma Nella mia esperienza, tende ad avere problemi di memoria, ma meno che repmat.

Quindi la sintassi sarebbe:

AA = bsxfun(@minus,A,b) Dove b è il vettore e A è la tua grande matrice

Ma ti invito a fare profilare la versione Loopy e quindi decidere!Molto probabilmente, a causa dei vincoli di memoria, potresti non avere una scelta :)

Altri suggerimenti

Le altre risposte sono un po 'obsolete - Matlab R2016b sembra avere Aggiunta la trasmissione come funzione standard .Un esempio da quel post del blog che corrisponde alla domanda:

>> A = ones(2) + [1 5]'
A =
     2     2
     6     6
.

Non so se questo accelererà il codice, ma la sottrazione di uno scalare da un vettore non ha problemi di memoria.Poiché la tua dimensione della matrice è così asimmetrica, il sovraccarico da un ciclo per il ciclo della breve dimensione è trascurabile.

Quindi forse

matout = matin;
for j = 1:size(matin, 1) %3 in this case
     matout(j,:) = matin(j,:) - vec_to_subtract(j);
end
.

Certo, potresti farlo in posizione, ma non sapevo se volevi preservare la matrice originale.

In realtà, sembra che http://www.frontieriet.net/~dmschwarz/Genops.html (Operatore Overloading con file MEX) Anche il trucco, anche se non l'ho ancora testato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top