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



我想创建一个大小为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中做到这一点?

使用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的情况,它可能会表现得更好。不过你得测试一下。

您也可以使用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以及长度为n x 1的所有平方的向量。然后我们调用spdiags来定义这个向量将沿着这个矩阵的对角线填充到哪里。我们希望将主对角线定义为全1,以及主对角线左侧的对角线,或与主对角线相距-1。CCD_ 11将调整对角线上的元素总数以进行补偿。

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

通过一些索引杂耍,您也可以做到这一点:

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

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

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

这也可以用bsxfun:完成

n = 5;        %// matrix size
d = [0 -1];   %// diagonals you want set to 1
M = double(ismember(bsxfun(@minus, 1:n, (1:n).'), d));

例如,要获得主对角线和下面两条对角线设置为1的5x5矩阵,请定义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

相关内容

最新更新