我有这个创建带对角矩阵的示例代码
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);
答案 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);