改变非方矩阵的对角线

时间:2013-11-14 18:49:34

标签: matlab matrix diagonal

假设我有这种矩阵:

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

4 个答案:

答案 0 :(得分:5)

您可以使用linear indexing轻松完成此操作,甚至不需要重塑!

[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

答案 1 :(得分:2)

这是一个通用的解决方案,使用线性索引和模运算:

[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

答案 2 :(得分:0)

s=min(size(m))
m(1:s,1:s)=eye(s)+(~eye(s).*m(1:s,1:s))

答案 3 :(得分:0)

如果你想要一个较短的版本而不将行数与列数进行比较,你可以试试这个(假设你想让任意矩阵M的对角元素等于1):

M(logical(speye(size(M)))) = 1