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

Matlab 创建大尺寸矩阵时内存不足,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

该代码从输入图像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(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,您将需要