1

我有一个大的密集矩阵,例如大小为 10000 x 10000 的矩阵 A,我需要从中提取带宽为 10 的带状矩阵,即

B(i,j) = A(i,j) 如果 |ij| <=10

B(i,j) = 0 否则

在 MATLAB 中执行此操作的最有效方法是什么?

4

3 回答 3

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;

注意:此方法假定您的带宽是奇数。

于 2013-04-30T21:10:47.000 回答
0

由于它是一个巨大的矩阵,因此不要将其第二次复制到内存中可能是一个有用的选择。在这种情况下

N = 10;
M = ...
for lin = 1:size(M,1)
    M(lin, lin+N:end) = 0;
    M(lin, 1:lin-N) = 0;
end

可能有用(取决于之后是否需要原始矩阵)。

在您必须保留原始矩阵的情况下,您可以考虑将矩阵对角线或稀疏矩阵表示为对角线。如果您必须复制矩阵,则不应触摸所有不需要的元素。

您应该评估不同的方式并告诉我们您的结果:-)

于 2013-04-30T22:25:07.920 回答
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))
于 2013-04-30T22:53:55.057 回答