Matlab中3D矩阵指定维度求和结果维度不一致问题求助
解决Matlab sum函数求和后维度不一致的问题
嘿,这个问题我之前也踩过坑!Matlab的sum函数在处理不同维度求和时的输出形状确实有个小细节需要注意——你遇到的情况是因为Matlab默认的行为:当对最后一个维度求和时,会自动去掉那个长度变为1的维度,返回低维矩阵;而对前面的维度求和时,会保留该维度(即使长度为1),维持原有的维度数。
想要让sum1和sum2也像sum3一样输出2D矩阵,有两种简单的方法:
方法1:使用squeeze函数挤压维度
squeeze的作用就是去掉矩阵中所有长度为1的维度,正好能解决你的问题:
x = rand(5,3,2); sum1 = squeeze(sum(x,1)); % 原本是1×3×2,挤压后变成3×2的2D矩阵 sum2 = squeeze(sum(x,2)); % 原本是5×1×2,挤压后变成5×2的2D矩阵 sum3 = sum(x,3); % 原本就是5×3的2D矩阵
验证一下形状:size(sum1)会返回[3,2],完全符合你的预期。
方法2:在sum中指定'keepdims'参数为false
Matlab的sum函数支持通过'keepdims'参数控制是否保留求和后的维度。当设置为false时,求和后会自动去掉那个长度为1的维度,直接返回低维结果:
x = rand(5,3,2); sum1 = sum(x,1,'keepdims',false); % 直接得到3×2的2D矩阵 sum2 = sum(x,2,'keepdims',false); % 直接得到5×2的2D矩阵 sum3 = sum(x,3); % 保持原有结果
这种方法更直接,不需要额外调用squeeze,一步到位。
两种方法的小区别
squeeze会去掉所有长度为1的维度,如果你的矩阵有多个维度长度为1,它会一次性全部去掉;'keepdims',false只会去掉你当前求和的那个维度,其他长度为1的维度会保留(不过在你的场景里两种方法效果完全一致)。
内容的提问来源于stack exchange,提问作者Tulkkas




