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?

È stato utile?

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:

  1. Accertati di clear Eventuali variabili che non sono in uso prima di provare l'operazione.
  2. 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).

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