假设我有这种矩阵:
1 2 3
3 2 3
4 5 6
7 8 9
3 2 3
如何在其中添加对角线?有没有简单的方法?为了说明我的意思:
1 2 3
3 1 3
4 5 1
1 8 9
3 1 3
你可以用线性索引很容易地做到这一点,你甚至不需要重塑!
[r, c] = size(m);
m(1:c:end) = 1;
m =
1 2 3
4 1 6
7 8 1
1 11 12
13 1 15
如果r < c
,这是我得到的最好的:
if r < c
n = m';
n(1:r:end) = 1;
m = n';
else
m(1:c:end) = 1;
end
这是一个通用解决方案,使用线性索引和模运算:
[R C] = size(m);
ii = 1:R;
jj = mod(ii,C);
jj(jj==0) = C;
m(ii+(jj-1)*R) = 1; %// or m(sub2ind([R C],ii,jj)) = 1;
例如,
m =
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20 21
变成
m =
1 2 3
4 1 6
7 8 1
1 11 12
13 1 15
16 17 1
1 20 21
s=min(size(m))
m(1:s,1:s)=eye(s)+(~eye(s).*m(1:s,1:s))
如果你想要一个更短的版本而不比较行数和列数,你可以试试这个(假设你想让任意矩阵 M 的对角元素等于 1):
M(logical(speye(size(M)))) = 1