Arrays 在MATLAB中创建一个对角线和左对角线均为1的矩阵
我想创建一个大小为Arrays 在MATLAB中创建一个对角线和左对角线均为1的矩阵,arrays,matlab,matrix,Arrays,Matlab,Matrix,我想创建一个大小为nxn的正方形矩阵,其中对角线元素和左对角线都等于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(ones(n),0) - tril(ones(n),-2) 如果你想要一行更粗的1s,只需调整-2: n = 10; m = 4; tril(ones(n),0) - tril(ones(n),-m) 如果您喜欢使用exc
nxn
的正方形矩阵,其中对角线元素和左对角线都等于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(ones(n),0) - tril(ones(n),-2)
如果你想要一行更粗的1
s,只需调整-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的厚度,它的性能可能更好。不过,您必须对其进行测试。您也可以使用too创建该矩阵:
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
前两行定义了矩阵的所需大小,假设一个正方形nxn
,以及所有长度nx1
的向量。然后我们调用spdiags
来定义该向量将沿着该矩阵的对角线填充的位置。我们希望将主对角线定义为所有的1以及主对角线左侧的对角线,或远离主对角线的-1
spdiags
将调整远离主对角线的对角线的元素总数以进行补偿
我们还确保输出的大小为
nxn
,但该矩阵实际上是。我们需要将矩阵转换为完整的结果。通过一些索引,您还可以执行以下操作:
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))
简单方法使用:
这也可以通过以下方式实现: 例如,要获得一个5x5矩阵,其中主对角线和下面的两条对角线设置为
1
,请定义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
使用两次,将它们加在一起。始终只使用
1
s?的两条对角线。Dan yes allways withones@efirvida我已经改变了你问题的措辞和标题,以便更好地反映所提出的问题。诸如“Matlab如何创建此矩阵”之类的标题不是一个有意义的标题。如果有其他人和你有同样的问题,那么让标题更有意义将大大有助于让问题易于搜索。让我知道你的想法,或者如果你想让我恢复编辑。@rayryeng感谢对sparse
:D.+1.的所有善意滥用。我总是在身边。:)
n = 5; %// matrix size
d = [0 -1]; %// diagonals you want set to 1
M = double(ismember(bsxfun(@minus, 1:n, (1:n).'), d));
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