Matlab 创建大尺寸矩阵时内存不足
该代码从输入图像x中随机选择J=R*T样本。x是MxN image.PHi_2操作符首先从M中随机选择R行,然后从N中随机选择T列,并保持公共M&N像素的采样,并将其他像素设置为零。 此代码适用于小尺寸图像,但对于大尺寸图像(512x512),matlab给了我低内存错误(创建Phi2=0(J,S1*S2);)时的第四行)。您能帮我修复它吗?我还选择了R=T=362Matlab 创建大尺寸矩阵时内存不足,matlab,matrix,out-of-memory,Matlab,Matrix,Out Of Memory,该代码从输入图像x中随机选择J=R*T样本。x是MxN image.PHi_2操作符首先从M中随机选择R行,然后从N中随机选择T列,并保持公共M&N像素的采样,并将其他像素设置为零。 此代码适用于小尺寸图像,但对于大尺寸图像(512x512),matlab给了我低内存错误(创建Phi2=0(J,S1*S2);)时的第四行)。您能帮我修复它吗?我还选择了R=T=362 function [ y2,Phi2 ] = Phi2_operator( x,R,T ) J=R*T; [S1,S2]=size
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。您可以使用两个参数调用:
randperm(n,k)
,它从区间1:n
中随机选择k
样本。这样您就不需要创建变量a
2.您可以使用矢量化方法,而不是在for循环中将值分配给z
和y2
,方法是:z(k,:)=x(k,:)代码>。这比循环更快、更短。您也不需要对k
进行排序
现在来看更重要的事情:
3.您创建了z
和y2
,它们都具有x
的完整大小,但您只返回y2
。放下z
,这样可以节省一些内存。再次借助逻辑索引,我们得到:
k1 = randperm(S1,R);
k2 = randperm(S2,T);
y2(k1,k2) = x(k1,k2);
4.让我们看看什么是Phi2
:使用X=find(y2)
可以得到y2
中每个非零元素的值。Phi2
的一个简单示例如下所示:
0 0 1 0 0 0 ...
0 0 0 0 1 0 ...
0 0 0 0 0 1 ...
...
这告诉我们第一个非零元素(Phi2的第一行)位于y2的第三个线性索引处。第二个非零元素(第二行)位于y2的第五个线性索引处。第三个非零元素(第三行)位于y2的第六个线性索引处,依此类推。这不会增加额外的知识,但需要一个巨大的矩阵。我不认为你真的需要这个,可能会有办法解决你的问题,而不创建这个矩阵
如果你真的需要这个巨大的Phi2,你会想把它做成一个矩阵:
对于具有R=128
和T=64
的256*256
图像,全尺寸矩阵将为4294967296字节,即4 GB
!稀疏矩阵只有651272字节
或636kb
所有的东西放在一起都是
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
您可以稍微优化一下代码:
1。您可以使用两个参数调用:randperm(n,k)
,它从区间1:n
中随机选择k
样本。这样您就不需要创建变量a
2.您可以使用矢量化方法,而不是在for循环中将值分配给z
和y2
,方法是:z(k,:)=x(k,:)代码>。这比循环更快、更短。您也不需要对k
进行排序
现在来看更重要的事情:
3.您创建了z
和y2
,它们都具有x
的完整大小,但您只返回y2
。放下z
,这样可以节省一些内存。再次借助逻辑索引,我们得到:
k1 = randperm(S1,R);
k2 = randperm(S2,T);
y2(k1,k2) = x(k1,k2);
4.让我们看看什么是Phi2
:使用X=find(y2)
可以得到y2
中每个非零元素的值。Phi2
的一个简单示例如下所示:
0 0 1 0 0 0 ...
0 0 0 0 1 0 ...
0 0 0 0 0 1 ...
...
这告诉我们第一个非零元素(Phi2的第一行)位于y2的第三个线性索引处。第二个非零元素(第二行)位于y2的第五个线性索引处。第三个非零元素(第三行)位于y2的第六个线性索引处,依此类推。这不会增加额外的知识,但需要一个巨大的矩阵。我不认为你真的需要这个,可能会有办法解决你的问题,而不创建这个矩阵
如果你真的需要这个巨大的Phi2,你会想把它做成一个矩阵:
对于具有R=128
和T=64
的256*256
图像,全尺寸矩阵将为4294967296字节,即4 GB
!稀疏矩阵只有651272字节
或636kb
所有的东西放在一起都是
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
您可以稍微优化一下代码:
1。您可以使用两个参数调用:randperm(n,k)
,它从区间1:n
中随机选择k
样本。这样您就不需要创建变量a
2.您可以使用矢量化方法,而不是在for循环中将值分配给z
和y2
,方法是:z(k,:)=x(k,:)代码>。这比循环更快、更短。您也不需要对k
进行排序
现在来看更重要的事情:
3.您创建了z
和y2
,它们都具有x
的完整大小,但您只返回y2
。放下z
,这样可以节省一些内存。再次借助逻辑索引,我们得到:
k1 = randperm(S1,R);
k2 = randperm(S2,T);
y2(k1,k2) = x(k1,k2);
4.让我们看看什么是Phi2
:使用X=find(y2)
可以得到y2
中每个非零元素的值。Phi2
的一个简单示例如下所示:
0 0 1 0 0 0 ...
0 0 0 0 1 0 ...
0 0 0 0 0 1 ...
...
这告诉我们第一个非零元素(Phi2的第一行)位于y2的第三个线性索引处。第二个非零元素(第二行)位于y2的第五个线性索引处。第三个非零元素(第三行)位于y2的第六个线性索引处,依此类推。这不会增加额外的知识,但需要一个巨大的矩阵。我不认为你真的需要这个,可能会有办法解决你的问题,而不创建这个矩阵
如果您真的需要这个巨大的Phi2,您将需要