在MATLAB中创建一个带有对角线和左对角线的矩阵

efi*_*ida 3 arrays matlab matrix

我想创建一个大小的方阵,n x n其中对角元素和左对角线都等于1.其余元素等于0.

例如,如果矩阵为5 x 5,这将是预期的结果:

1 0 0 0 0
1 1 0 0 0
0 1 1 0 0
0 0 1 1 0
0 0 0 1 1
Run Code Online (Sandbox Code Playgroud)

我怎么能在MATLAB中做到这一点?

Dan*_*Dan 6

琐碎使用tril功能:

tril(ones(n),0) - tril(ones(n),-2)
Run Code Online (Sandbox Code Playgroud)

如果你想要更粗的线条,1只需调整-2:

n = 10;
m = 4;
tril(ones(n),0) - tril(ones(n),-m)
Run Code Online (Sandbox Code Playgroud)

如果你喜欢使用diagexcaza建议,那么试试吧

diag(ones(n,1)) + diag(ones(n-1,1),-1)
Run Code Online (Sandbox Code Playgroud)

但你无法通过这种方式控制条纹的"厚度".但是,对于2的厚度,它可能表现更好.你必须测试它.


ray*_*ica 5

您也可以使用它spdiags来创建该矩阵:

n = 5;
v = ones(n,1);
d = full(spdiags([v v], [-1 0], n, n));
Run Code Online (Sandbox Code Playgroud)

我们得到:

>> d

d =

     1     0     0     0     0
     1     1     0     0     0
     0     1     1     0     0
     0     0     1     1     0
     0     0     0     1     1
Run Code Online (Sandbox Code Playgroud)

前两行定义矩阵的所需大小,假设一个正方形n x n以及所有长度的矢量n x 1.然后spdiags,我们调用以定义此向量的对角线上的这个向量将填充的位置.我们希望将主对角线定义为具有所有的对角线以及主对角线左侧的对角线,或者-1远离主对角线. spdiags将调整远离主要对角线的元素总数进行补偿.

我们还确保输出的大小n x n,但实际上是这个矩阵 sparse.我们需要将矩阵转换full为完成结果.


Amr*_*mro 5

有一些指数杂耍,你也可以这样做:

N = 5;
ind = repelem(1:N, 2);    % [1 1 2 2 3 3 ... N N]
M = full(sparse(ind(2:end), ind(1:end-1), 1))
Run Code Online (Sandbox Code Playgroud)


Raf*_*iro 5

使用线性索引的简单方法:

n = 5;
M = eye(n);
M(2:n+1:end) = 1;
Run Code Online (Sandbox Code Playgroud)