【问题标题】:Memory Issue - Large Poisson Matrices内存问题 - 大型泊松矩阵
【发布时间】:2013-07-24 16:09:26
【问题描述】:

我正在做一些信号处理,我需要生成一个泊松矩阵,但我正在使用的数据足够大,以至于 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);

提前致谢!

【问题讨论】:

    标签: matlab memory matrix poisson


    【解决方案1】:

    A+ 努力!但是有一种更有效的方法可以做到这一点。你需要稀疏矩阵。尝试类似

    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);
    

    如果你真的想自己生成它。我发布了这个方法,这样你就可以学习如何使用一般实践来制作带状稀疏矩阵。但是对于泊松矩阵,您可以简单地使用内置的 MATLAB:

    B = gallery('poisson',n);
    

    为了说明为什么需要稀疏矩阵,请尝试检查 n 的各种值的稀疏性

    sparsity = nnz(B)/prod(size(B));
    

    将数字 n 增加到 20 左右是泊松矩阵真正发挥作用的时候,因为它们确实是稀疏的(接近 1% 是非零)。 MATLAB 中的所有这些零都是浪费空间。因此,当您通过完整的 for 循环方法生成 B 时,您正在积累内存!要查看差异,请尝试使用您的原始代码,例如

    sB = whos('B');
    sC = whos('C');
    disp(sA.bytes);
    disp(sB.bytes);
    

    看到对于 n = 20,你得到 B = 1280000 字节和 C = 33928 字节。但是使用这种规定的方法则 A = 33896 字节!相差近 1.2 MB!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多