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

时间:2016-10-10 16:23:24

标签: matlab loops diagonal multiple-conditions

我有一个5x5矩阵V1,在第一行和第一列都有值和分类。如果你愿意,你可以想到经济中具有分类的部门。前两个扇区具有3位数分类,后两个扇区具有4位数分类。

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. 如果分类代码有四位数并且分类代码在第一行和第一列中都相等,则总结整列(不包括列的第一个值,即分类代码本身)< / LI>
  2. 另外,分类代码在列中有三位数字,然后将值保留为
  3. 否则指定零。
  4. 结果矩阵应如下所示:

    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
    

    感谢您的任何提示!

1 个答案:

答案 0 :(得分:0)

由于您在代码执行时更改了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