我正在做一些信号处理,我需要生成泊松矩阵,但我正在使用的数据足够大,以至于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);
提前致谢!
答案 0 :(得分:2)
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-loop方法生成B时,你正在积极地记忆!要查看差异,请尝试使用原始代码,例如
sB = whos('B');
sC = whos('C');
disp(sA.bytes);
disp(sB.bytes);
看到对于n = 20,你得到B = 1280000字节和C = 33928字节。但是使用这种规定的方法然后A = 33896字节!这差不多有1.2 MB!