我想用matlab制作一个三对角矩阵,使用
full(gallery('tridiag', 10, 1, -4, 6, -4, 1))
我认为我在函数中有太多的参数。还有另一种方法吗?
我正在尝试制作以下矩阵:
6 -4 1 0 0
-4 6 -4 1 0
1 -4 6 -4 1
0 1 -4 6 -4
0 0 1 -4 6
答案 0 :(得分:5)
由于您的矩阵为pentadiagonal,我认为最佳解决方案是使用spdiags
:
>> n = 5;
>> full(spdiags(ones(n,1)*[1,-4,6,-4,1],[-2,-1,0,1,2],n,n));
ans =
6 -4 1 0 0
-4 6 -4 1 0
1 -4 6 -4 1
0 1 -4 6 -4
0 0 1 -4 6
full
是可选的,不建议用于大n
。
答案 1 :(得分:2)
由于有5个非零对角线,因此不是三对角矩阵,因此您无法使用tridiag
选项。你必须通过diag()
函数手动生成这样的矩阵,它允许你创建一个给定对角线的矩阵,你也可以选择你想要写的对角线。
你可以通过创建5个不同的矩阵来实现这一点,每个矩阵都有一个给定的非零对角线:
n=5;
B=diag(6*ones(n,1),0)+diag(-4*ones(n-1,1),1)+diag(-4*ones(n-1,1),-1)+diag(1*ones(n-2,1),2)+diag(1*ones(n-2,1),-2);
在此代码n=5
是您的矩阵的顺序,然后diag(6*ones(n,1),0)
将创建一个包含所有n
的向量(长度6
),并且此类向量将被放置在第0个对角线。这样的矩阵在其他地方将为零
同样地,diag(-4*ones(n-1,1),1)
将创建一个包含所有n-1
的向量(长度-4
),并且此类向量将放置在第一个超对角线中。这样的矩阵在其他地方将为零,我们将这样的矩阵与前一个矩阵相加
这种“连锁反应”一直持续到矩阵完全生成为止。
更新:我一直在寻找gallery()
帮助,确实有一个选择Toeplitz pentadiagonal。您可能想要使用
full(gallery('toeppen',5,1,-4,6,-4,1))
答案 2 :(得分:1)
我同意,对于你的大案例,基于稀疏的解决方案,例如Troy Haskin的解决方案是最好的。但是,值得注意的是,您正在精确构建Toeplitz矩阵(Alessiox hinted),并且您可以使用内置的toeplitz()
来执行此操作。所需要的只是弄清楚填充第一行和列的输入非零元素所需的零的数量(这是必要的,因为toeplitz
断言矩阵的大小以根据输入向量的维度构造):
n = 5; %// linear size of result
v = [1,-4,6,-4,1]; %// nonzero diagonal elements symmetrically
mid = ceil(length(v)/2); %// index of diagonal in the input vector
zerosvec = zeros(1,n-mid); %// zeros for padding the rest
colvec = [v(mid:-1:1), zerosvec]; %// first column of the result
rowvec = [v(mid:end), zerosvec]; %// first row of the result
toeplitz(colvec,rowvec) %// toeplitz does the heavy lifting