Fuera de la memoria en MATLAB - ¿Cómo realizar operaciones en el lugar en elementos matriciales?

StackOverflow https://stackoverflow.com/questions/8400475

Pregunta

Estoy cargando una matriz bastante grande en Matlab. Cargar esta matriz ya empuja a Matlab a sus límites, pero se ajusta.

Luego hago lo siguiente y obtengo un error fuera de memoria.

data( :, 2:2:end, :, : ) = - data( :, 2:2:end, :, : );

¿Matlab está asignando una nueva matriz para esta operación? Supongo que esta operación no necesitaría memoria adicional. ¿Cómo obligo a Matlab a ser más eficiente para esto?

Pregunta extra:

'Datos = Permute (datos, [1 2 3 4 5 12 8 7 6 9 10 11]);'

¿Puede Matlab hacer esto en el lugar?

¿Fue útil?

Solución

Hay algunas limitaciones (más al bloque de Loren citado por John):

  • Su código debe estar ejecutándose dentro de una función
  • No debe tener otros alias para 'datos'

El asunto de los 'alias' es importante y potencialmente difícil de acertar. MATLAB usa Copy-On-Write, lo que significa que cuando llama a una función, el argumento que pasa no se duplica de inmediato, pero puede copiarse si lo modifica dentro de la función. Por ejemplo, considere

x = rand(100);
y = myfcn(x);
% with myfcn.m containing:
function out = myfcn(in)
  in(1) = 3;
  out = in * 2;
end

En ese caso, la variable x se pasa a myfcn. MATLAB tiene una semántica de valor, por lo que cualquier modificación al argumento de entrada in No debe verse en el espacio de trabajo de llamadas. Entonces, la primera línea de myfcn causa el argumento in convertirse en Copiar de x, en lugar de simplemente un alias. Considere lo que pasa con try/catch - Esto puede ser un asesino en el lugar, porque Matlab tiene que poder preservar los valores si se agota. En el siguiente:

% consider this function
function myouterfcn()
  x = rand(100);
  x = myfcn(x);
end
% with myfcn.m containing
function arg = myfcn( arg )
  arg = -arg;
end

entonces eso debería Obtenga la optimización en el lugar para x en myouterfcn. Pero lo siguiente no puede:

% 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

Espero que parte de esta información ayude ...

Otros consejos

MATLAB admite operaciones en el lugar. Aquí hay una discusión: http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/. Lo siento, no puedo ser más ayuda.

No creo que haya una buena manera de saber qué está haciendo realmente Matlab debajo de las sábanas. Te recomendaría que:

  1. Asegúrese clear Cualquier variable que no esté en uso antes de probar la operación.
  2. Si todavía se está quedando sin memoria, escriba y compile un archivo MEX simple para hacer la operación en su lugar. Con una matriz masiva y su requisito especializado, probablemente también sería más rápido que el enfoque de Matlab.

Del mismo modo, puede escribir su propio algoritmo de permutación como un archivo .mex en C si necesita que se haga en el lugar (es decir, se está quedando sin memoria nuevamente).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top