我想创建一个大小为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=5
和d = [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