首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在matlab中生成三对角矩阵

在matlab中生成三对角矩阵
EN

Stack Overflow用户
提问于 2016-03-22 21:43:26
回答 3查看 4.8K关注 0票数 2

我想用matlab建立一个三对角矩阵,用

代码语言:javascript
运行
复制
full(gallery('tridiag', 10,  1, -4, 6, -4, 1)) 

我认为我在函数中有太多的论点。还有别的办法吗?

我正在努力制作以下矩阵:

代码语言:javascript
运行
复制
 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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-22 22:12:28

由于有5个非零对角线,这不是一个三对角矩阵,所以不能使用tridiag选项。您必须通过diag()函数手动生成这样的矩阵,该函数允许您创建具有给定对角线的矩阵,还可以选择要写入的对角线。

因此,可以通过创建5个不同的矩阵来实现这一点,每个矩阵都有一个给定的非零对角线:

代码语言:javascript
运行
复制
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五对角的选项。你可能会想用

代码语言:javascript
运行
复制
full(gallery('toeppen',5,1,-4,6,-4,1))
票数 2
EN

Stack Overflow用户

发布于 2016-03-22 22:13:27

由于您的矩阵是五对角,所以我认为最好的解决方案是使用spdiags

代码语言:javascript
运行
复制
>> 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

票数 5
EN

Stack Overflow用户

发布于 2016-03-23 00:02:27

我同意,对于您的巨大案例,基于稀疏的解决方案,如特洛伊·哈斯金的解决方案是最好的。但是,值得注意的是,您正精确地构造一个Toeplitz矩阵(如阿莱西奥克斯),您可以使用内置的toeplitz()来实现这一点。所需要的只是计算填充第一行和第一列的输入非零元素所需的零数(这是必要的,因为toeplitz断言要从输入向量的维度构造矩阵的大小):

代码语言:javascript
运行
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36165821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档