我有一个大的密集矩阵,例如大小为 10000 x 10000 的矩阵 A,我需要从中提取带宽为 10 的带状矩阵,即
B(i,j) = A(i,j) 如果 |ij| <=10
B(i,j) = 0 否则
在 MATLAB 中执行此操作的最有效方法是什么?
我有一个大的密集矩阵,例如大小为 10000 x 10000 的矩阵 A,我需要从中提取带宽为 10 的带状矩阵,即
B(i,j) = A(i,j) 如果 |ij| <=10
B(i,j) = 0 否则
在 MATLAB 中执行此操作的最有效方法是什么?
我不知道这是最有效的方法,但这是一种通过使用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;
注意:此方法假定您的带宽是奇数。
由于它是一个巨大的矩阵,因此不要将其第二次复制到内存中可能是一个有用的选择。在这种情况下
N = 10;
M = ...
for lin = 1:size(M,1)
M(lin, lin+N:end) = 0;
M(lin, 1:lin-N) = 0;
end
可能有用(取决于之后是否需要原始矩阵)。
在您必须保留原始矩阵的情况下,您可以考虑将矩阵对角线或稀疏矩阵表示为对角线。如果您必须复制矩阵,则不应触摸所有不需要的元素。
您应该评估不同的方式并告诉我们您的结果:-)
假设您有一个矩阵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))