在 Matlab 中创建能带矩阵

Create band matrix in Matlab

我正在尝试在 Matlab 中创建一个带状矩阵,对于 matrix_size = 6 和 band_width = 1 应该看​​起来像这样:

[1,1,0,0,0,0]
[1,2,2,0,0,0]
[0,2,3,3,0,0]
[0,0,3,4,4,0]
[0,0,0,4,5,5]
[0,0,0,0,5,6]

值应该是这样的。 我确实运行了,这给了我结果:

[1,1,0,0,0,0]
[1,1,1,0,0,0]
[0,1,1,1,0,0]
[0,0,1,1,1,0]
[0,0,0,1,1,1]
[0,0,0,0,1,1]

我的函数代码:

function M=bandmatrix(n,r)
% n -- matriz size 
% r -- band width
% n >= r + 2

M = sign(conv2(eye(n),ones(r+1),'same'));

end

如何实现这个功能?我也将感谢该功能,其中的值与我想要的相同,但功能不依赖于带宽。谢谢!

您可以按如下方式使用diag

 diag(1:6)+diag(1:5,1)+diag(1:5,-1)

一般来说,对于任何订单 n:

 diag(1:n)+diag(1:n-1,1)+diag(1:n-1,-1)

你也可以这样做:

clear;

m = 6;
n = 6;

diags = repmat((1:6)', 1, 3);
diagidx = [-1:1];

for k = 1:length(diagidx)
    if(diagidx(k) > 0)
        diags(:, k) = circshift(diags(:, k), diagidx(k), 1);
    end
end

sparseMat = spdiags(diags, [-1:1], m, n);

myMat = full(sparseMat)

使用稀疏矩阵允许我们指定数据并且只分配一次。 但这也意味着需要根据矩阵的胖瘦来移动对角线中使用的值。