Matlab 内存问题-大泊松矩阵

Matlab 内存问题-大泊松矩阵,matlab,memory,matrix,poisson,Matlab,Memory,Matrix,Poisson,我正在做一些信号处理,我需要生成一个泊松矩阵,但是我正在处理的数据太大了,以至于matlab像我现在做的那样耗尽了内存 我已经在这方面花了一点时间,现在有点困惑,所以我希望你们能帮助我找到一种更有效的生成矩阵的方法,即解决matlab内存不足的问题 不管怎样,这就是我到目前为止所拥有的 n = 20; B = zeros(n^2,n^2); for i = 1:n^2 for j = 1:n^2 if i == j B(i,j) = 4; elseif i ==

我正在做一些信号处理,我需要生成一个泊松矩阵,但是我正在处理的数据太大了,以至于matlab像我现在做的那样耗尽了内存

我已经在这方面花了一点时间,现在有点困惑,所以我希望你们能帮助我找到一种更有效的生成矩阵的方法,即解决matlab内存不足的问题

不管怎样,这就是我到目前为止所拥有的

n = 20;

B = zeros(n^2,n^2);
for i = 1:n^2
for j = 1:n^2
    if i == j
        B(i,j) = 4;
    elseif i == j+1
        B(i,j) = -1;
    elseif i == j-1
        B(i,j) = -1;
    elseif i == j+n
        B(i,j) = -1;
    elseif i == j-n
        B(i,j) = -1;
    end
end
end

for i = n:n:n^2-1
    for j = n:n:n^2-1
        B(i+1,j) = 0;
        B(i,j+1) = 0;
    end
end

C = sparse(B);

提前谢谢

好吧,努力吧!但有一种更有效的方法可以做到这一点。你需要稀疏矩阵。试试像这样的东西

n = 20;
e = ones(n^2,1);
o = e;
for i = n:n:n^2-1
    o(i) = 0;
end
A = spdiags([-e -o 4*e -o -e], [-(n+1) -1 0 1 (n+1)], n^2, n^2);
sB = whos('B');
sC = whos('C');
disp(sA.bytes);
disp(sB.bytes);
如果你真的想自己生成它。我发布了这个方法,这样你就可以学习如何使用常规方法制作带状稀疏矩阵。但是对于泊松矩阵,您可以简单地使用内置的MATLAB矩阵:

B = gallery('poisson',n);
为了说明为什么需要稀疏矩阵,请尝试使用

sparsity = nnz(B)/prod(size(B));
当泊松矩阵确实是稀疏的(接近1%为非零)时,将数字n增加到20左右的某个位置会产生影响。MATLAB中的所有这些零都是浪费的空间。因此,当您通过完整for循环方法生成B时,您正在积累内存!若要查看差异,请尝试使用原始代码,如

n = 20;
e = ones(n^2,1);
o = e;
for i = n:n:n^2-1
    o(i) = 0;
end
A = spdiags([-e -o 4*e -o -e], [-(n+1) -1 0 1 (n+1)], n^2, n^2);
sB = whos('B');
sC = whos('C');
disp(sA.bytes);
disp(sB.bytes);
若要查看n=20,则得到B=1280000字节和C=33928字节。但是使用这个规定的方法,那么A=33896字节!这是将近1.2MB的差异