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

在MATLAB中从稠密矩阵中提取带状矩阵,matlab,Matlab,我有一个大的密集矩阵,比如大小为10000×10000的矩阵a,我需要从中提取一个带宽为10的带状矩阵,即 B(i,j)=A(i,j)如果| i-j |我不知道这是最有效的方法,但这里有一种方法可以通过使用toeplitz()函数的掩蔽创建围绕主对角线的矩阵带: r = zeros(1,size(A,2)); r(1 : ceil(bandwidth/2)) = 1; bandedMask = toeplitz(r); %Create a banded toeplitz matrix of 1s

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


B(i,j)=A(i,j)如果| i-j |我不知道这是最有效的方法,但这里有一种方法可以通过使用
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))
B=rand(16,7);
n=4;
%索引主对角线
szB=尺寸(B);

idx=abs(bsxfun(@减号,(1:szB(1)),1:szB(2)))为什么需要将其他所有设置为零?@OlegKomarov我不需要显式将剩余设置为零。我想要的是一个在带宽内只包含a元素的稀疏B。