创建带对角矩阵时,spdiags的“索引超出矩阵尺寸”错误?

时间:2014-08-19 23:58:40

标签: arrays matlab matrix sparse-matrix

我有这个创建带对角矩阵的示例代码

T = 6;
d1 = ones(T-2, 1);
d2 = 2*ones(T-1, 1);
d3 = 3*ones(T, 1);

f = sparse(diag(d1, -2) + diag(d2, -1) + diag(d3) + diag(d2, 1) + diag(d1, 2));

但我想避免创建完整的TxT矩阵,所以我想使用spdiags,如下所示:

f2 = spdiags(d1, -2, T, T) + spdiags(d2, -1, T, T) + spdiags(d3, 0, T, T) + ...
    spdiags(d2, 1, T, T) + spdiags(d1, 2, T, T);

matlab告诉我"指数超过矩阵维度"问题来自这些命令

spdiags(d2, 1, T, T)
spdiags(d3, 2, T, T)

但这些命令正常工作:

spdiags(d1, -2, T, T)
spdiags(d2, -1, T, T)

这里发生了什么?最终矩阵应该看起来像稀疏形式:

f =
     3     2     1     0     0     0
     2     3     2     1     0     0
     1     2     3     2     1     0
     0     1     2     3     2     1
     0     0     1     2     3     2
     0     0     0     1     2     3

这些是样本矩阵,我只使用它作为示例。

此代码也适用:

T = 6;
d1 = ones(T-2, 1);
d2 = 2*ones(T-1, 1);
d3 = 3*ones(T, 1);

f = sparse(diag(d1, -2) + diag(d2, -1) + diag(d3) + diag(d2, 1) + diag(d1, 2));

B = [[d1;0;0], [d2;0], d3, [0;d2], [0;0;d1]];
f2 = spdiags(B, -2:2, T, T);

1 个答案:

答案 0 :(得分:1)

documentation不是很清楚。看起来您需要d向量的长度为T,即使某些值将被忽略(即,正对角线会忽略第一个值,对于负对角线会忽略最后一个值) 。但不知何故,Matlab实际上只是抱怨正对角线;对于负对角线,它确实接受较短的向量。

所以:使用长度为d的所有T向量:

T = 6;
d1 = ones(T, 1);
d2 = 2*ones(T, 1);
d3 = 3*ones(T, 1);
f2 = spdiags(d1, -2, T, T) + spdiags(d2, -1, T, T) + spdiags(d3, 0, T, T) + ...
    spdiags(d2, 1, T, T) + spdiags(d1, 2, T, T);

顺便说一下,您可以构建一个包含所有d向量作为列的矩阵(现在它们都具有相同的长度),并且只需调用spdiags一次:

f2 = spdiags([d1 d2 d3 d2 d1], -2:2, T, T);