Fuori memoria in Matlab - Come eseguire il funzionamento sul posto su elementi matrix?
-
28-10-2019 - |
Domanda
Sto caricando una matrice abbastanza grande in Matlab. Il caricamento di questa matrice spinge già Matlab ai suoi limiti, ma si adatta.
Quindi faccio quanto segue e ricevo un errore fuori memoria.
data( :, 2:2:end, :, : ) = - data( :, 2:2:end, :, : );
Matlab sta allocando una nuova matrice per questa operazione? Suppongo che questa operazione non avrebbe bisogno di memoria extra. Come faccio a costringere Matlab ad essere più efficiente per questo?
Domanda bonus:
'data = permute (dati, [1 2 3 4 5 12 8 7 6 9 10 11]);'
Matlab può farlo sul posto?
Soluzione
Ci sono alcuni vincoli (più avanti a quelli del blocco di Loren citato da John):
- Il tuo codice deve essere in esecuzione all'interno di una funzione
- Non è necessario non avere altri alias per "dati"
La cosa degli "alias" è sia importante che potenzialmente difficile da ottenere. MATLAB usa copia-su-write, il che significa che quando si chiama una funzione, l'argomento che passa non è immediatamente duplicato, ma potrebbe essere copiato se lo modifichi all'interno della funzione. Ad esempio, considera
x = rand(100);
y = myfcn(x);
% with myfcn.m containing:
function out = myfcn(in)
in(1) = 3;
out = in * 2;
end
In tal caso, la variabile x
è passato a myfcn
. Matlab ha una semantica di valore, quindi eventuali modifiche all'argomento di input in
non deve essere visto nell'area di lavoro chiamante. Quindi, la prima riga di myfcn
provoca l'argomento in
per diventare un copia di x
, piuttosto che semplicemente un alias. Considera cosa succede try
/catch
- Questo può essere un killer sul posto, perché Matlab deve essere in grado di preservare i valori se si è usciti. Nel seguente:
% consider this function
function myouterfcn()
x = rand(100);
x = myfcn(x);
end
% with myfcn.m containing
function arg = myfcn( arg )
arg = -arg;
end
Quindi, quello dovrebbe Ottieni l'ottimizzazione sul posto per x
in myouterfcn
. Ma quanto segue non può:
% consider this function
function myouterfcn()
x = rand(100);
x = myfcn(x);
end
% with myfcn.m containing
function arg = myfcn( arg )
try
arg = -arg;
catch E
disp( 'Oops.' );
end
end
Spero che alcune di queste informazioni aiutino ...
Altri suggerimenti
Matlab supporta operazioni sul posto. Ecco una discussione: http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/. Scusa, non posso essere più aiuto.
Non credo che ci sia un buon modo per sapere cosa sta davvero facendo Matlab sotto i fogli. Consiglierei a te:
- Accertati di
clear
Eventuali variabili che non sono in uso prima di provare l'operazione. - Se stai ancora esaurendo la memoria, scrivi e compila un semplice file MEX per eseguire l'operazione in atto. Con un enorme array e il tuo requisito specializzato, probabilmente sarebbe anche più veloce dell'approccio di Matlab.
Allo stesso modo, potresti scrivere il tuo algoritmo di permutazione come file .mex in C se richiedi che sia fatto sul posto (cioè stai esaurendo la memoria).