【发布时间】:2019-02-11 11:30:12
【问题描述】:
我的目标是创建一个在偏移对角线上创建矩阵的函数:
与eye(5) 函数非常相似,但现在在偏移对角线上。最好不要使用双 for 循环。我不想要完整的矩阵,而是必须将它们插入现有的矩阵中。我怎样才能做到这一点?
【问题讨论】:
我的目标是创建一个在偏移对角线上创建矩阵的函数:
与eye(5) 函数非常相似,但现在在偏移对角线上。最好不要使用双 for 循环。我不想要完整的矩阵,而是必须将它们插入现有的矩阵中。我怎样才能做到这一点?
【问题讨论】:
diag 内置了这个功能:
diag(ones(4,1),1)
ans =
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
0 0 0 0 0
diag(ones(4,1),-1)
ans =
0 0 0 0 0
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
diag(V,k) 的语法是:V 是要放在对角线上的向量(无论是一个向量还是任何奇数向量),k 是对角线的标签。 0 是主对角线,正整数越远离上对角线,负整数越远离下对角线;即k=1 给出第一个上对角线,k=-4 在这个例子中给出左下角。
为了完整起见,如果您只想要索引而不是完整矩阵(因为您建议要将向量插入到当前矩阵中),您可以使用以下函数:
function [idx] = diagidx(n,k)
% n size of square matrix
% k number of diagonal
if k==0 % identity
idx = [(1:n).' (1:n).']; % [row col]
elseif k>0 % Upper diagonal
idx = [(1:n-k).' (1+k:n).'];
elseif k<0 % lower diagonal
idx = [(1+abs(k):n).' (1:n-abs(k)).'];
end
end
idx 的每一行都包含矩阵的索引。
【讨论】:
triu(B+1,1)-triu(B+1,2)
在第一个上非对角线上创建一个,并且
tril(B+1,-2)-tril(B+1,-3)
对第一个较低的非对角线也是如此。
【讨论】:
diag 或triu 创建掩码,对吗?在这种情况下,我会选择diag(ones()) 选项,将其设为逻辑掩码(或使用subs2ind),然后将向量索引到矩阵中。