我正在尝试创建一个矩阵(32 x 32),其主对角线为-1,第一和第二超对角线为1。 0到处都是。
A = eye(32)* -1;
这给了我一个主对角线上带-1的矩阵,我该怎么办?
答案 0 :(得分:7)
n=32;
toeplitz([-1; zeros(n-1,1)],[-1 1 1 zeros(1,n-3)])
是你需要的。这将创建一个非对称的Toeplitz矩阵(带矩阵),其第一列由[-1; zeros(32-1,1)]
给出,第一列由[-1 1 1 zeros(1,32-3)]
给出。如有必要,您还可以将大小为n
的函数定义为输入参数。
答案 1 :(得分:6)
您可以使用spdiags
将对角线直接设置为稀疏矩阵和full
- 如果需要,可以设置。
n = 32;
Asparse = spdiags(ones(n,1)*[-1,1,1],[0,1,2],n,n);
Afull = full(Asparse);
答案 2 :(得分:5)
n = 32
A = -1*eye(n); %Create 32x32 Identity
A(n+1:n+1:n^2) = 1; %Set 1st Superdiagonal to 1
A(2*n+1:n+1:n^2) = 1; %Set 2nd Superdiagonal to 1
请注意,MATLAB使用column-major order作为矩阵。对于第一个超对角线,我们从第(n + 1)个元素开始,并在其上选择每个第(n + 1)个元素。除了从(2 * n + 1)个元素开始之外,我们对第二个超对角线进行类似的操作。
答案 3 :(得分:5)
只需使用diag
和eye
:
n = 32;
z = ones(n-1,1);
A = diag(z,1)+diag(z(1:n-2),2)-eye(n);
还有:
n = 32;
A = gallery('triw',n,1,2)-2*eye(n)
答案 4 :(得分:4)
diag
允许您创建一个通过对角线的矩阵:
-diag(ones(n,1),0)+diag(ones(n-1,1),1)+diag(ones(n-2,1),2)
主对角线的最后一个参数0,1和超级对角线的1和2。
答案 5 :(得分:3)
如果我可以建议更多深奥的代码,首先创建一个满1s的向量,然后创建单位矩阵,然后使用向量移位创建带有这些1的对角矩阵,并将其向右移1,减少数量向量中的元素,然后再次为最后的超对角线。
n = 32;
vec = ones(n,1);
out = -eye(n) + diag(vec(1:end-1),1) + diag(vec(1:end-2),2);
答案 6 :(得分:2)
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;
使用diag
答案 7 :(得分:2)
另一种方法:它使用信号处理工具箱中的convmtx
:
n = 32; %// matrix size
v = [-1 1 1]; %// vector with values
M = convmtx(v, n);
M = M(:,1:end-numel(v)+1);