5

我正在将一个相当大的矩阵加载到 Matlab 中。加载这个矩阵已经把 Matlab 推到了极限——但它很合适。

然后我执行以下操作,我得到一个内存不足的错误。

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

Matlab 是否为此操作分配了一个新矩阵?我会假设这个操作不需要额外的内存。我如何强制 Matlab 为此提高效率?

奖金问题:

'数据=置换(数据,[1 2 3 4 5 12 8 7 6 9 10 11]);'

matlab可以就地做到这一点吗?

4

3 回答 3

4

有一些限制(进一步来自约翰引用的 Loren 的块):

  • 您的代码必须在函数内运行
  • 您不能有“数据”的其他别名

“别名”这件事既重要又可能难以正确处理。MATLAB 使用写时复制,这意味着当您调用函数时,您传递的参数不会立即复制,但如果您在函数中对其进行修改,则可能会被复制。例如,考虑

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

在这种情况下,变量x被传递给myfcn. inMATLAB 具有值语义,因此不得在调用工作区中看到对输入参数的任何修改。因此,第一行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对in进行就地优化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

希望这些信息对您有所帮助...

于 2011-12-06T15:48:16.243 回答
2

Matlab 确实支持就地操作。这是一个讨论:http: //blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/。抱歉,我无法提供更多帮助。

于 2011-12-06T14:55:14.180 回答
0

我不认为有一个好方法可以知道 MATLAB 在工作表下到底在做什么。我建议你:

  1. 在尝试操作之前,请确保您clear有任何未使用的变量。
  2. 如果您的内存仍然不足,请编写并编译一个简单的 mex 文件来执行该操作。有了庞大的数组和您的特殊要求,它可能也比 MATLAB 的方法更快。

同样,如果您需要就地完成(即您再次耗尽内存),您可以将自己的置换算法编写为 C 中的 .mex 文件。

于 2011-12-06T13:54:27.350 回答