Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Matlab上创建此矩阵?_Matlab_Matrix - Fatal编程技术网

如何在Matlab上创建此矩阵?

如何在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用于矩阵。对于第一个超对角线,我

我试图创建一个矩阵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用于矩阵。对于第一个超对角线,我们从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);