繁体   English   中英

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

[英]How to rediagonalize the diagonal of a matrix in MATLAB?

我有一个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. 如果分类代码具有四个数字,并且第一行和第一列中的分类代码均相等,则将整个列加起来(不包括该列的第一个值,这是分类代码本身)
  2. Elseif如果分类代码的列中有三位数字,则将值保留为原样
  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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM