创建大尺寸矩阵时内存不足

时间:2015-10-05 13:57:47

标签: matlab matrix out-of-memory

此代码从输入图像x中随机选择J = R * T个样本。 x是MxN图像.PHi_2运算符首先从M中随机选择R行,然后从N中随机选择T列并保持常用M&的样本。 N个像素并将其他设置为零。 这段代码适用于小尺寸图像,但对于大尺寸图像(512x512),matlab给出了低内存错误(第4行创建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

1 个答案:

答案 0 :(得分:3)

您可以稍微优化您的代码:

1。您可以使用以下两个参数调用randpermrandperm(n,k),从k区间随机选择1:n个样本。这样您就不需要创建变量a

2。您可以使用矢量化方法z,而不是将值分配给for循环中的y2z(k,:) = x(k,:);。这比循环更快更短。您也不需要对k进行排序。

现在更重要的事情:

3。您创建的zy2都具有x的完整尺寸,但您只返回y2。删除z,可以节省一些内存。再次借助逻辑索引,我们得到:

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

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

4. 让我们看看Phi2是什么:使用X=find(y2),您将获得y2中每个非零元素的linear indexPhi2的一个简单示例如下所示:

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

这告诉我们第一个非零元素(Phi2的第一行)位于y2的第3个线性索引处。第二个非零元素(第二行)位于y2的第5个线性索引处。第三个非零元素(第三行)位于y2的第6个线性索引处,依此类推。这增加了 no 附加知识,但需要一个巨大的矩阵。我不认为你真的需要这个,可能有办法解决你的问题而不创建这个矩阵。

如果确实需要这个巨大的Phi2,您需要将其设为sparse矩阵:

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

对于256*256R=128的{​​{1}}图片,全尺寸矩阵为T=64,即4294967296 bytes!稀疏矩阵仅为4 GB651272 bytes

一切都放在一起

636 kB