Недостаточно памяти в Matlab - как выполнить операцию на месте над элементами матрицы? - PullRequest
5 голосов
/ 06 декабря 2011

Я загружаю довольно большую матрицу в Matlab. Загрузка этой матрицы уже подталкивает Matlab к своим пределам - но он подходит.

Затем я делаю следующее и получаю ошибку нехватки памяти.

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

Matlab выделяет новую матрицу для этой операции? Я предполагаю, что эта операция не потребует дополнительной памяти. Как заставить Matlab быть более эффективным для этого?

Бонусный вопрос:

'data = permute (данные, [1 2 3 4 5 12 8 7 6 9 10 11]);'

Может ли Matlab сделать это на месте?

Ответы [ 3 ]

3 голосов
/ 06 декабря 2011

Есть несколько ограничений (в дополнение к тем из блока Лорен, на который ссылается Джон):

  • Ваш код должен выполняться внутри функции
  • У вас не должно быть других псевдонимов«data»

«Псевдонимы» важны и потенциально трудны для понимания.MATLAB использует функцию копирования при записи, что означает, что при вызове функции передаваемый аргумент не дублируется немедленно, но может быть скопирован, если вы измените его в функции.Например, рассмотрим

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

. В этом случае переменная x передается в myfcn.MATLAB имеет семантику значений, поэтому любые изменения входного аргумента in не должны отображаться в вызывающей рабочей области.Итак, первая строка myfcn заставляет аргумент in стать копией из x, а не просто псевдонимом к нему.Посмотрите, что происходит с try / catch - это может быть убийцей на месте, потому что MATLAB должен быть в состоянии сохранить значения, если вы допустите ошибку.Далее:

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

, тогда должен получить оптимизацию на месте для x в myouterfcn.Но следующее не может:

% 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

Надеюсь, что эта информация поможет ...

2 голосов
/ 06 декабря 2011

Matlab поддерживает операции на месте. Вот обсуждение: http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/. Извините, я не могу больше помочь.

0 голосов
/ 06 декабря 2011

Не думаю, что есть хороший способ узнать, что на самом деле делает MATLAB под простынями. Я бы порекомендовал вам:

  1. Убедитесь, что вы clear все переменные, которые не используются, прежде чем пытаться выполнить операцию.
  2. Если вам все еще не хватает памяти, напишите и скомпилируйте простой mex-файл, чтобы выполнить операцию на месте. С массивным массивом и вашими специализированными требованиями, это, вероятно, будет быстрее, чем подход MATLAB.

Аналогично, вы можете написать свой собственный алгоритм перестановки в виде файла .mex в C, если вам требуется, чтобы он был выполнен на месте (т. Е. У вас снова не хватает памяти).

...