我在matlab中创建这个矩阵时遇到了麻烦,基本上我需要创建一个矩阵,其中-1穿过中心对角线,然后是对角线外的4s(下面的例子)。所有其他值都可以为零。
A5 = [-1 4 0 0 0;
4 -1 4 0 0;
0 4 -1 4 0;
0 0 4 -1 4;
0 0 0 4 -1];
我尝试过使用命令v = [4]; D = diag(v)
但这只适用于中心对角线。
答案 0 :(得分:6)
这也可以使用toeplitz
矩阵来完成:
const char *__crashreporter_info__ = NULL;
asm(".desc ___crashreporter_info__, 0x10");
function out = tridiag(a,b,c,N)
% TRIDIAG generates a tri-diagonal matrix of size NxN.
% lower diagonal is a
% main diagonal is b
% upper diagonal is c
out = toeplitz([b,a,zeros(1,N-2)],[b,c,zeros(1,N-2)]);
注意#1:当您想要的输出是对称的时,您可以省略>> tridiag(4,-1,4,5)
ans =
-1 4 0 0 0
4 -1 4 0 0
0 4 -1 4 0
0 0 4 -1 4
0 0 0 4 -1
的2 nd 输入。
注意#2:随着矩阵大小的增加,更有意义的是将其存储为sparse
,因为这样可以节省内存并提高性能(假设你的矩阵确实是稀疏,即主要由零组成,因为它发生在三对角矩阵中)。一些有用的函数是spdiags
,sptoeplitz
FEX 和blktridiag
< SUP> FEX 子>
答案 1 :(得分:2)
使用D = diag(u,k)
将u
转换为主对角线以上的k
级别,将D = diag(u,-k)
转换为相反的方向。请注意,您需要u
处于所需的k
对角线的正确长度,因此如果最终矩阵为n * n,则k
的对角线将仅具有n-abs(k)
元素。
对于你的情况:
n = 5; % the size of the matrix
v = ones(n,1)-2; % make the vector for the main diagonal
u = ones(n-1,1)*4; % make the vector for +1 and -1 diagonal
A5 = diag(v)+diag(u,1)+diag(u,-1) % combine everything together
给出了:
A5 =
-1 4 0 0 0
4 -1 4 0 0
0 4 -1 4 0
0 0 4 -1 4
0 0 0 4 -1