【问题标题】:MATLAB logicical indexing RAM constraints; workaround?MATLAB 逻辑索引 RAM 约束;解决方法?
【发布时间】:2012-12-05 14:46:36
【问题描述】:

我有一个数组I = 6100x6300x72 应用于函数,结果Icor 包含一些我想用零替换的负值。虽然这是一个很多问的问题,但在我的情况下,RAM 限制使任务变得更加困难。举个例子:

I=rand(6100,6300,72); %# example size of I
[x,y,z]=size(I); %# get the dimensions for later reshaping
I=reshape(I,x*y,z); %# reshape to columns
Icor=function(I) %# apply a function to I, result Icor
Icor(Icor < 0)=0; %# Icor has negatives which need removing
Icor=reshape(Icor,x,y,z); %# reshape back to same size as I (original size)

我的问题在于逻辑索引步骤,Icor(Icor &lt; 0)=0;,这是我的 RAM 最大化的地方。有没有创造性的方法来解决这个问题? (如果我错过了一些非常明显的事情,请原谅我)。

【问题讨论】:

  • 如何清除原始副本I out(清除I)?那么,提取Icor 的子集并一一处理呢?
  • 或者重写function以返回0而不是一个负数,使Icor(Icor &lt; 0)=0这一步变得多余?
  • 我已经尝试清除 I 的原始副本,但它仍然存在错误。也许在Icor 的向量上按列删除零然后重塑的循环可能是解决方案
  • 为了使事情复杂化,我想我将I分成两半并分别处理每一半..
  • 不能解决您的问题,但您可以使用I=reshape(I,[],z); 而不是I=reshape(I,x*y,z);

标签: arrays matlab vector indexing


【解决方案1】:

我会遍历最后一个维度 - 它与使用 vectorized 逻辑索引一样有效。您必须遍历最后一个维度,因为前两个连续存储在内存中,因此这种访问是最有效的:

% forgive my lack of memory ;)
I = rand(610,630,72)-0.5;
s = size(I);

% temporary variables for the test
I1 = reshape(I, [], s(3));
I2 = I1;

% method 1
tic;
I1(I1<0) = 0;
toc

% method 2
tic;
for i=1:s(3)
    I2(I2(:,i)<0,i) = 0;
end
toc

isequal(I1, I2)

Elapsed time is 0.321225 seconds.
Elapsed time is 0.282395 seconds.

ans =

 1

如您所见,循环实际上更快,因此对您来说是双赢的局面。

【讨论】:

    【解决方案2】:

    一旦你开始耗尽内存,通常你需要改变一些非常重要的东西来让你的内存使用恢复正常。

    但是,如果您想专门找到与您的掩码调用等效的循环,请尝试以下代码:

    完全矢量化的调用(就像现在一样)

    Icor(Icor < 0)=0;
    

    每行等效(假设为二维矩阵)

    for ix = 1:size(Icor,1)
        Icor(Icor(ix,1)<0,  1) = 0;
    end
    

    每个元素等效

    for ix = 1:numel(Icor)
        if iCor(ix) < 0
            iCor(ix) = 0;
        end
    end
    

    【讨论】:

    • 感谢这些。我将对每行等效项有所了解,这不应该太占用内存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多