我想用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
发布于 2016-03-22 22:12:28
由于有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)
将创建一个包含所有6
的向量(长度n
),这样的向量将放置在第0对角。这样的矩阵在其他地方将为零。
类似地,diag(-4*ones(n-1,1),1)
将创建一个包含所有-4
的向量(长度n-1
),这样的向量将放置在第一个超对角线中。这样的矩阵在其他地方将为零,我们将此矩阵与前一个矩阵相加。
这种“链式反应”一直持续到矩阵完全生成。
Update:我一直在查看gallery()
帮助,并且确实有一个Toeplitz五对角的选项。你可能会想用
full(gallery('toeppen',5,1,-4,6,-4,1))
发布于 2016-03-22 22:13:27
发布于 2016-03-23 00:02:27
我同意,对于您的巨大案例,基于稀疏的解决方案,如特洛伊·哈斯金的解决方案是最好的。但是,值得注意的是,您正精确地构造一个Toeplitz矩阵(如阿莱西奥克斯),您可以使用内置的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
https://stackoverflow.com/questions/36165821
复制相似问题