如何在Matlab上构建带状矩阵?

时间:2017-07-03 13:45:46

标签: matlab matrix

我正在尝试建立带状矩阵

C = [-1 1 ... 0]
    [ -1 1 ....]
    [..........]
    [0.....-1 1]

我设法用

创建一个不同的带状矩阵
spdiags(ones(nx,1)*[1 -2 1],-1:1,nx,nx)

看起来像这样:

C = [-2  1 ... 0]
    [ 1 -2 .....]
    [......... 1]
    [0..... 1 -2]

但是,如果我将[1 -2 1]更改为[-1 1],则无效。

我收到错误消息

>> spdiags(ones(nx,1)*[-1 1],-1:1,nx,nx)
Index exceeds matrix dimensions.

Error in spdiags (line 102)
         a((len(k)+1):len(k+1),:) = [i i+d(k) B(i+(m>=n)*d(k),k)];

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

正如doc spdiags将告诉您的那样,spdiags的第二个参数指定将在矩阵中替换的对角线。如果您想修改不同的对角线,您可以指定它们。

这将做你想要的:

>> nx = 5;
>> C = spdiags(ones(nx,1)*[-1 1],0:1,nx,nx+1);
>> full(C)

ans =

    -1     1     0     0     0     0
     0    -1     1     0     0     0
     0     0    -1     1     0     0
     0     0     0    -1     1     0
     0     0     0     0    -1     1

答案 1 :(得分:1)

稍微复杂的方法:

n = 5;                                   % desired number of columns
p = [-1 1];                              % pattern for each row
C = conv2(eye(n), flip(p), 'valid').';   % result

答案 2 :(得分:1)

这里有两种非常快速的方法(尽管可以通过删除矩阵乘法来加速你的方法)。

您可以使用eye(创建对角线)和zeros(填充额外列)的简单组合来获得所需的结果:

nx = 5;
C = [-eye(nx), zeros(nx,1)] + [zeros(nx,1), eye(nx)];

% C = -1     1     0     0     0     0
%      0    -1     1     0     0     0
%      0     0    -1     1     0     0
%      0     0     0    -1     1     0
%      0     0     0     0    -1     1

或者使用diag创建偏移对角线,并减去eye矩阵,但您需要删除最后一行。这给出了相同的结果:

C = diag(ones(nx,1),1) - eye(nx+1);
C = C(1:end-1, :);