[英]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位代码的列。 这意味着在四位数的列中,值应在整个列中求和,然后移至对角线。 特别是,该代码应执行以下步骤:
结果矩阵应如下所示:
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.