我正在将一个相当大的矩阵加载到 Matlab 中。加载此矩阵已经将 Matlab 推向了极限 - 但它适合。
然后我执行以下操作,但出现内存不足错误。
data(:, 2:2:end, :, :) = - data(:, 2:2:end, :, :);
Matlab 是否为此操作分配了一个新矩阵?我会假设这个操作不需要额外的内存。我如何强制 Matlab 对此更有效率?
奖励问题:
'data = permute(data,[1 2 3 4 5 12 8 7 6 9 10 11]);'
matlab 可以就地执行此操作吗?
最佳答案
有一些限制条件(除了 John 引用的 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
。 MATLAB 具有值语义,因此在调用工作区中不得看到对输入参数 in
的任何修改。因此,myfcn
的第一行导致参数 in
成为 x
的副本,而不是简单的一个别名。考虑一下 try
/catch
会发生什么 - 这可能是就地 killer ,因为 MATLAB 必须能够在您出错时保留值。在以下内容中:
% consider this function
function myouterfcn()
x = rand(100);
x = myfcn(x);
end
% with myfcn.m containing
function arg = myfcn( arg )
arg = -arg;
end
然后,应该在 myouterfcn
中对 x
进行就地优化。但以下不能:
% 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
希望这些信息中的一些对...有帮助...
关于matlab - Matlab 内存不足 - 如何对矩阵元素进行就地运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8400475/