如何在MATLAB中重新对角矩阵的对角线?

问题描述:

我有一个5x5矩阵,V1,使用值和所述第一行和第一列中的分类。如果你愿意,你可以考虑一个经济体中有分类的部门。前两个部门有3位数分类,最后两个部门有4位数分类。如何在MATLAB中重新对角矩阵的对角线?

V1 = 

      0   101   111  1234  1111 
      101   4   0   7   0 
      111   5   8   0   0 
      1234   6   0   6   2 
      1111   0   0   4   9 

现在,我想使用MATLAB重新对角化所有具有4位代码的列。这意味着在四位数列中,值应当在整列上加总并移至对角线。特别是,代码应该执行以下步骤:

  1. 如果分类代码具有四个数字和分类代码是所述第一行和第一列中相等,则总结整个列(不包括该该列的第一个值,即分类代码本身)
  2. 如果分类代码在列中有三位数字,则保留该值原样
  3. 否则分配一个零。

得到的矩阵应该是这样的:

V1 = 

      0   101   111  1234  1111 
      101   4   0   0   0 
      111   5   8   0   0 
      1234   6   0   17   0 
      1111   0   0   0   11 

我曾尝试下面的代码,但没有奏效:

[vrow vcol] = size(V1) 
for c = 2:vcol; 
    for r = 2:vrow; 
     if all([ V1(1,c) == V1(r,1), numel(num2str(V1(1,c))) > 3, numel(num2str(V1(r,1))) > 3 ]) ; 
      V1(r,c) = sum(V1(2:end,c)) ; 
     elseif numel(num2str(V1(1,c))) == 3; 
      V1(r,c) = V1(r,c); 
     else 
      V1(r,c) = 0; 
     end 
    end 
end 

与上面的代码,我得到了以下结果,这是接近所需的结果,只有列求和还没有工作:

V1 = 

       0   101   111  1234  1111 
      101   4   0   0   0 
      111   5   8   0   0 
      1234   6   0   10   0 
      1111   0   0   0   9 

谢谢你的提示!

既然你改变V1的元素作为代码执行,也依赖于值V1得到你的答案(当你总结列),如果设置一个值的0需要之前你有错误总和。下面,我已经通过初始化第二个矩阵V2作为输出来解决了这个问题。我也已先行去除一些不必要的线条,在评论中解释

[vrow vcol] = size(V1); 
V2 = zeros(vrow, vcol); 
for c = 2:vcol; 
    for r = 2:vrow; 
     if all([ V1(1,c) == V1(r,1), numel(num2str(V1(1,c))) > 3]) ; %Third statement was redundant 
      V2(r,c) = sum(V1(2:end,c)) ; 
     elseif numel(num2str(V1(1,c))) == 3; 
      V2(r,c) = V1(r,c); 
     end %We intialized whole thing to 0, so we don't need to set elements to 0 
    end 
end