在MATLAB中创建一个对角线和左对角线均为1的矩阵。

3
我希望创建一个大小为 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

我该如何在MATLAB中实现这个功能?

使用 diag 两次,将它们相加。 - sco1
始终只有两条对角线上有“1”吗? - Dan
@Dan 是的,总是使用1。 - efirvida
2
@efirvida,我已经修改了你的问题和标题,以更好地反映所要求的内容。例如,“如何创建此矩阵的Matlab代码”是一个有意义的标题。如果其他人遇到与你相同的问题,使标题更有意义将有助于使问题易于搜索。让我知道你的想法,或者如果你想让我恢复编辑。 - rayryeng
1
@rayryeng 感谢你的一切。 - efirvida
5个回答

6

使用tril函数轻松实现:

tril(ones(n),0) - tril(ones(n),-2)

如果你想要更粗的 1 的线,只需将 -2 调整为其他数值即可:

n = 10;
m = 4;
tril(ones(n),0) - tril(ones(n),-m)

如果您更喜欢像excaza建议的那样使用diag,请尝试:
diag(ones(n,1)) + diag(ones(n-1,1),-1)

但是这种方法无法控制条纹的“厚度”。然而,如果厚度为2,可能会表现得更好。不过您需要进行测试。


5
你还可以使用spdiags创建该矩阵:
n = 5;
v = ones(n,1);
d = full(spdiags([v v], [-1 0], n, n));

我们得到:
>> 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

首先,前两行定义了矩阵的大小,假设是一个正方形的 n x n 矩阵,还有一个全为1且长度为n x 1的向量。接着我们调用spdiags函数来定义这个向量在矩阵主对角线上的位置。我们希望定义主对角线上的所有元素都为1,并且左侧离主对角线一格的对角线上的元素为-1spdiags将会相应地调整离主对角线的对角线元素总数。
我们还要确保输出结果的大小为n x n,但是这个矩阵实际上是稀疏矩阵。我们需要将该矩阵转换为完整矩阵以获得最终结果。

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))

很好地运用了sparse,加一分。 - rayryeng

5

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

n = 5;
M = eye(n);
M(2:n+1:end) = 1;

1
谢谢。我一直在这里。 :) - Rafael Monteiro

3
这也可以通过bsxfun来实现:
n = 5;        %// matrix size
d = [0 -1];   %// diagonals you want set to 1
M = double(ismember(bsxfun(@minus, 1:n, (1:n).'), d));

例如,要获得一个大小为5x5的矩阵,使其主对角线和下面两条对角线上的元素均为1,可以定义n=5d=[0 -1 -2],从而得到以下结果。
M =
     1     0     0     0     0
     1     1     0     0     0
     1     1     1     0     0
     0     1     1     1     0
     0     0     1     1     1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接