1

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 < 0)=0;这是我的 RAM 最大化的地方。有没有创造性的方法来解决这个问题?(或者如果我错过了一些非常明显的东西,请原谅我)。

4

2 回答 2

3

我会遍历最后一个维度——它与使用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

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

于 2012-12-05T15:24:11.290 回答
0

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

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

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

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
于 2012-12-05T15:16:40.607 回答