在MATLAB中从密集矩阵中提取带状矩阵

时间:2013-04-30 20:52:56

标签: matlab

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

B(i,j)= A(i,j)if | i-j | < = 10

B(i,j)= 0否则

在MATLAB中最有效的方法是什么?

3 个答案:

答案 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))