2012-12-05 65 views
1

我有一個適用於函數的數組I = 6100x6300x72,結果Icor包含一些我想用零替換的負值。雖然這是一個很多問題,但在我的情況下,內存限制使得任務變得更加困難。就拿例如:MATLAB邏輯索引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馬克塞斯。有沒有創造性的方法呢? (或者如果我錯過了一些非常明顯的東西,請原諒我)。

+1

如何清除原始副本'我'出來(清除'I')?那麼,如何提取'Icor'的子集並逐個處理它們呢? – Acorbe

+1

或者重寫'function'來返回'0'而不是一個負數,使'Icor(Icor <0)= 0'這個步驟變得多餘? –

+0

我試過清除'I'的原始副本,但它仍然存在錯誤。也許一個循環刪除'Icor'矢量列零的循環,然後重塑可能是解決方案 – MBL

回答

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 

正如你看到的,循環實際上要快,所以它對你來說是一個雙贏的局面。

+0

感謝您的工作示例 – MBL

0

一旦你開始內存不足,通常你需要改變一些相當重要的東西來重新使用內存。

但是,如果要專門找回路等效面罩通話,請嘗試以下代碼:

完全量化的調用(比如你現在有)

Icor(Icor < 0)=0; 

每行當量(假設2D矩陣)

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 
+0

感謝您的這些。我會在每行相當於一個不應該太記憶密集的裂縫。 – MBL