如何在Matlab上创建此矩阵?
我试图创建一个矩阵32 x 32,主对角线上有-1,第一和第二超对角线上有1。其他地方0如何在Matlab上创建此矩阵?,matlab,matrix,Matlab,Matrix,我试图创建一个矩阵32 x 32,主对角线上有-1,第一和第二超对角线上有1。其他地方0 A = eye(32)* -1; 这给了我一个主对角线上有-1的矩阵,我该怎么做 N = 32; A = -diag(ones(N,1)); % diagonal tmp1=diag(ones(N-1,1),1); %1st supra tmp1=diag(ones(N-2,1),2); @2nd supra A = A+tmp1+tmp2; 使用 请注意,MATLAB用于矩阵。对于第一个超对角线,我
A = eye(32)* -1;
这给了我一个主对角线上有-1的矩阵,我该怎么做
N = 32;
A = -diag(ones(N,1)); % diagonal
tmp1=diag(ones(N-1,1),1); %1st supra
tmp1=diag(ones(N-2,1),2); @2nd supra
A = A+tmp1+tmp2;
使用
请注意,MATLAB用于矩阵。对于第一个超对角线,我们从n+1元素开始,然后选择其上的每个n+1元素。除了从2*n+1元素开始,我们对第二超对角线做了类似的运算
n=32;
toeplitz([-1; zeros(n-1,1)],[-1 1 1 zeros(1,n-3)])
这就是你需要的。这将创建一个非对称的Toeplitz矩阵—带矩阵,其第一列由[-1;zeros32-1,1]给出,第一行由[-1 zeros1,32-3]给出。如有必要,您还可以定义一个大小为n的函数作为输入参数。您可以使用该函数将对角线直接设置为稀疏矩阵,并根据需要将其填充
n = 32;
Asparse = spdiags(ones(n,1)*[-1,1,1],[0,1,2],n,n);
Afull = full(Asparse);
仅使用和眼睛:
还有:
n = 32;
A = gallery('triw',n,1,2)-2*eye(n)
使用带有选项的函数。diag允许您创建通过对角线的矩阵:
-diag(ones(n,1),0)+diag(ones(n-1,1),1)+diag(ones(n-2,1),2)
最后一个参数0表示主对角线,1和2表示超对角线。如果我能建议更深奥的代码,首先创建一个充满1的向量,然后创建单位矩阵,然后用这些1和向量移位创建一个对角线矩阵,并向右移位1,减少向量中的元素数量,然后在最后一条超对角线上再做一次
n = 32;
vec = ones(n,1);
out = -eye(n) + diag(vec(1:end-1),1) + diag(vec(1:end-2),2);
另一种方法:使用信号处理工具箱:
n = 32; %// matrix size
v = [-1 1 1]; %// vector with values
M = convmtx(v, n);
M = M(:,1:end-numel(v)+1);
这不提供所描述的输出。这不是一个上对角线矩阵,不是一个三对角线矩阵。错误的对角线,问题1和2,不是-1和1。但我没有投反对票。@AndrasDeak:我明白了。固定的我以为OP是在谈论上面和下面的对角线。当然。请注意,我没有投反对票,只是指出了问题:嗯。。。有一刻,我看到一个接受复选标记出现在我的答案附近,但就在我无意中点击它之前,它不见了。你接受我的回答了吗?你刚刚接受了吗,系统中有一个主要的错误?我并不是想变得贫穷,我只是对我所看到的感到惊讶:@andrasdeakaccept现在回来了。干得好!谢谢@rayryeng,但我的问题仍然存在。这是一个奇怪而危险的bug,还是darkkkk7删除了accept本身?@AndrasDeak他们暂时不接受它。在此期间,我看到他/她的代表下降了2分。我想你的ping让OP再次接受了答案。@rayryeng啊,好吧,那么,谢谢你们两个:因为矩阵是正方形的,所以使用+1:n+1:end=1可能会有意义,而且可能会稍微快一点;A2*n+1:n+1:end=1;。如果这个答案在很多情况下都是最快的,我也不会感到惊讶。
n = 32;
vec = ones(n,1);
out = -eye(n) + diag(vec(1:end-1),1) + diag(vec(1:end-2),2);
n = 32; %// matrix size
v = [-1 1 1]; %// vector with values
M = convmtx(v, n);
M = M(:,1:end-numel(v)+1);