我有一个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
感谢您的任何提示!
答案 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