我正在尝试建立带状矩阵
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)];
我该如何解决这个问题?
答案 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, :);