MMULT,矩阵乘积没问题
这个函数的作用是返回两个数组的矩阵乘积。
啥是数组?咱们可以理解为一组数。
哪啥是矩阵呢,就是有数据的矩形单元格区域,例如下面这两个长方形或是正方形的区域:
这个函数的参数很简单:
MMULT(数组1,数组2)
两个数组在计算时,要求数组1的行数与数组2的列数相同,或者数组1的列数与数组2的行数相同。
比如下图中,左侧部分的两个数组因为列数与行数符合要求,就可以当成MMULT函数的两个参数进行计算,而右侧的两个数组则因为列数与行数不符合要求,就不能使用MMULT函数进行运算了。
函数结果会得到一个新的矩阵,这个矩阵的行数与 数组1 的行数相同,列数与 数组2 的列数相同。
上图中蓝色区域的公式结果看起来有点乱,其实就是用垂直方向的这个数组中的每个元素与水平方向数组中的每个元素对应相乘。
光看这些解释,很多小伙伴肯定会觉得这样太抽象了,下面咱们就来点具体的,用几个简单实例,来说说MMULT函数的基本用法。
1、计算综合成绩
如下图所示,每个同学有笔试和面试两项成绩,其中笔试成绩占比为60%,面试成绩占比为40%,现在需要计算综合成绩:
D2单元格输入以下公式,下拉。
=MMULT(B2:C2,G$2:G$3)
公式的意思是使用水平方向的数组B2:C2,与垂直方向的数组G$2:G$3执行乘法计算,计算过程是:
=88(笔试成绩)*60%(笔试占比)+90(面试成绩)*40%(面试占比)
公式中的数组1(B2:C2)是一行,而数组2(G$2:G$3)是一列,所以最终得到一个数组结果,这个数组的大小只有一行一列。
2、计算商品金额
如下图所示,第一行和第二行分别是商品单价和商品名称,在底部区域则是不同客户购买各个商品的数量。
需要在K列计算每个客户的应付金额。
如果在K2使用MMULT函数直接将数组1参数设置为表示数量的B3:J3,将数组2参数设置为表示单价的B1:J1,公式会返回错误值。
这是因为两个数组都是9列1行,数组1的行数(1)与数组2的列数(9)不同,并且数组1的列数(9)与数组2的行数(1)也不同。
怎么办呢?咱们可以在公式中嵌套TRANSPOSE函数,将其中一个数组的行列方向进行转置互换。
=MMULT(B3:J3,TRANSPOSE(B$1:J$1))
K2输入上述公式后,结果仍然是错误值,为什么呢?
这是因为数组1(B3:J3)中包含空白单元格了。
咱们将公式继续修改一下,在有空白单元格的数组1后面乘以1,这样一来,空白单元格变成了0,再计算就没有问题了:
=MMULT(B3:J3*1,TRANSPOSE(B$1:J$1))
熟悉函数公式的小伙伴可能早看出来了,上面的两个例子其实都可以使用SUMPRODUCT函数来完成,咱们就是为了让大家熟悉一下这个函数的基础用法。
下面再来说一个使用其他函数不太容易实现的问题。
3、餐费分摊
如下图所示,是某单位国庆值班人员的用餐记录。
F列是不同日期的餐费金额,B2:E7单元格区域是员工的进餐情况,1表示当日进餐次数为1,2表示当日进餐次数为2,空白表示当日没有进餐。
需要在B8:E8单元格区域中,根据每日的进餐人数和餐费,计算每个人应分摊的餐费金额。
计算方法为当日餐费除以当日进餐总次数,如1日餐费为54元,进餐次数为2+1+3,则张三分摊金额为54/(2+1+3)*2 即18元。
在计算张三总的分摊金额时,需要先计算出每一天的用餐总次数,然后用每一天的餐费除以每一天的用餐总次数,最后再乘以张三在每天的用餐次数,得到张三每天的分摊餐费,最后相加即可。
B8单元格输入以下数组公式,按<Ctrl+Shift+Enter>组合键结束编辑,然后向右复制到E8单元格。
=SUM($F2:$F7/MMULT($B2:$E7*1,1^ROW(1:4))*B2:B7)
由于$B2:$E7单元格区域中存在空白单元格,直接使用MMULT函数时将返回错误值,因此先乘以1将区域中的空白单元格转换为0。
1^ROW(1:4)部分,返回4行1列的内存数组{1;1;1;1},结果用作MMULT函数的数组2参数。(因为数据范围有四列,所以使用ROW(1:4),实际应用时可将4修改成实际的数据列数)
MMULT($B2:$E7*1,1^ROW(1:4))部分,依次计算每一行的矩阵相乘之和,返回内存数组结果为:
{6;7;6;3;4;7}
结果就是$B2:$E7单元格区域中每一行的总和,即每日进餐的总次数。
然后使用$F2:$F7单元格区域的每日餐费,除以MMULT函数得到的每日进餐总次数,得到在不同日期内的每次进餐应分摊金额。
再乘以B2:B7单元格区域中每天的个人进餐次数,得到张三每天的应分摊金额为:
{18;6;27.5;0;48;42.85}
最后使用SUM函数求和,得到应分摊餐费总额。
好了,今天咱们分享的内容就是这些吧,祝大家一天好心情!
图文制作:祝洪忠