我有一个大的密集矩阵,比如大小为10000乘10000的矩阵A,我需要从中提取带宽为10的带状矩阵,即
B(i,j)= A(i,j)if | i-j | < = 10
B(i,j)= 0否则
在MATLAB中最有效的方法是什么?
答案 0 :(得分:0)
我不知道这是最有效的方法,但是这里有一种方法可以通过使用toeplitz()
函数屏蔽来创建一个关于主对角线的矩阵:
r = zeros(1,size(A,2));
r(1 : ceil(bandwidth/2)) = 1;
bandedMask = toeplitz(r); %Create a banded toeplitz matrix of 1s and 0s
bandedMat = bandedMask.*A;
注意:此方法假设您的带宽为奇数。
答案 1 :(得分:0)
因为它是一个巨大的矩阵,所以不能将它再次复制到内存中是一个有用的选择。在那种情况下
N = 10;
M = ...
for lin = 1:size(M,1)
M(lin, lin+N:end) = 0;
M(lin, 1:lin-N) = 0;
end
可能很有用(取决于你之后是否需要原始矩阵)。
如果您必须保留原始矩阵,您可以考虑通过对角线或稀疏矩阵表示矩阵对角线。如果您必须复制矩阵,则不应触及所有不需要的元素。
您应该评估不同的方式并告诉我们您的结果: - )
答案 2 :(得分:0)
假设您有一个矩阵B
和带宽n
:
B = rand(16,7);
n = 4;
% Index main diagonal
szB = size(B);
idx = abs(bsxfun(@minus, (1:szB(1))',1:szB(2))) <= n;
% Build sparse
[r,c] = find(idx);
sparse(r,c,B(idx))