【问题标题】:Change diagonal of a non square matrix改变非方阵的对角线
【发布时间】:2013-11-14 18:49:33
【问题描述】:

假设我有这种矩阵:

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

【问题讨论】:

  • 所以您的意思是“替换”而不是 + 操作,对吧?

标签: matlab matrix diagonal


【解决方案1】:

您可以使用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

【讨论】:

  • @jkshah:老实说,我找不到这样做的方法并且仅使用线性索引来避免if。我更新了答案。如果你有更好的建议,! =)
  • @RobertP。 +1。看起来很完美!我没有更好的解决方案,但正在努力使其完成。欣赏你的想法。
  • @RobertP。你甚至不需要行号:为什么不只是m(1:size(m,2):end) = 1?但是请注意,您的解决方案仅适用于 r >= c
【解决方案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

【讨论】:

    【解决方案3】:
    s=min(size(m))
    m(1:s,1:s)=eye(s)+(~eye(s).*m(1:s,1:s))
    

    【讨论】:

    • 我在 m=[1,2,3;4,5,6;7,8,9;10,11,12;13,14,15] 上试过这个,但只有上对角线被替换了。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      相关资源
      最近更新 更多