2015-10-05 83 views
0

該代碼從輸入圖像x中隨機選擇J = R * T個採樣。 x是M×N圖像.PH_2運算符首先從M中隨機選擇R個行,然後從N箇中隨機選擇T個列,並保持共同的N個像素的樣本並將其他零設置爲零。 這段代碼適用於小尺寸圖像,但對於大尺寸圖像(512x512),matlab給了我很低的內存錯誤(當創建Phi2 =零(J,S1 * S2)時,第四行;)你能幫我解決它嗎?並且我選擇R = T = 362;創建大尺寸矩陣時的內存不足

function [ y2,Phi2 ] = Phi2_operator(x,R,T) 
J=R*T; 
[S1,S2]=size(x); 
z=zeros(size(x)); 
y2=zeros(size(x)); 
Phi2=zeros(J,S1*S2); 
k = randperm(S1); 
a=k(1:R); 
b=sort(a); 
l=length(b); 
for i=1:l 
z(b(i),:)=x(b(i),:); 
end 
clear i 
K=randperm(S2); 
A=K(1:T); 
B=sort(A); 
L=length(B); 
for i=1:L 
y2(:,B(i))=z(:,B(i)); 
end 
X=find(y2); 
for i=1:J 
Phi2(i,X(i))=1; 
end 
end 
+2

呀。去一家商店買一臺新電腦! –

+0

對於'512 x 512'圖像,'零(J,S1 * S2);'給你'262,144'列。根據'J'的值是什麼,這可能是大量的RAM。你確定要'S1 * S2'嗎? – excaza

+0

你有多少內存?它不應該是內存密集 – GameOfThrows

回答

3

您可以優化您的代碼位:

您可以致電randperm有兩個參數:randperm(n,k),其中隨機的動產k樣本區間1:n。這樣你就不需要創建變量a

2.而是在for循環分配值zy2的,你可以用一個量化的方法:z(k,:) = x(k,:);。這比循環更快更短。你也不需要排序k

我們更重要的東西:

創建zy2其都具有x全尺寸,但你只返回y2。刪除z,這可以節省您的一些內存。再次與邏輯索引的幫助下,我們得到:

k1 = randperm(S1,R); 
k2 = randperm(S2,T); 

y2(k1,k2) = x(k1,k2);  

4.讓我們來看看什麼Phi2是:用X=find(y2)你會得到每一個非零元素的linear indexy2。的Phi2一個簡單的例子是這樣的:

0 0 1 0 0 0 ... 
0 0 0 0 1 0 ... 
0 0 0 0 0 1 ... 
... 

這就告訴我們,第一個非零元素(的Phi2第一行)是y2第三線性指數。第二個非零元素(第二行)位於y2的第五個線性索引處。第三個非零元素(第三行)位於y2的第六個線性索引處,依此類推。這增加了沒有額外的知識,但需要一個巨大的矩陣。我不認爲你真的需要這個,可能會有辦法解決你的問題,而不創建這個矩陣。

如果你真的需要這個巨大Phi2,你將要使它成爲一個sparse矩陣:

Phi2 = sparse(1:J,X,ones(1,J)); 

對於R=128T=64一個256*256圖像,全尺寸的矩陣將4294967296 bytes這是4 GB!稀疏矩陣僅爲651272 bytes636 kB

一切放在一起是

function [ y2,Phi2 ] = Phi2_operator(x,R,T) 
    J = R * T; 
    [S1,S2] = size(x); 

    y2 = zeros(size(x)); 

    k1 = randperm(S1,R); 
    k2 = randperm(S2,T); 

    y2(k1,k2) = x(k1,k2); 

    X=find(y2); 
    Phi2 = sparse(1:J,X,ones(1,J)); 
end 
+0

謝謝,但我得到錯誤k1 = randperm(S1,R); ???錯誤使用==> randperm 輸入參數太多。 –

+0

我認爲這是因爲我的matlab版本,我的matlab是ver。 2011 –

+0

我該如何解決它? –