矩阵乘积函数mmult基础应用1:条件求和
小伙伴们好,今天继续来学习一下mmult的基础用法。先从最简单的求和开始,然后再到条件求和。不知道大家对于mmult的规则了解了多少,还是先来复习一下它的规则。第1参数的列数要和第2参数的行数相同,结果区域的行数与第1参数的行数相同,结果区域的列数与第2参数的列数相同。2个参数中的元素必须都是数字,mmult返回的结果是数组。
可以想一下昨天的矩形图,第1参数放在左下角,第2参数放右上角,左上角的区域必须形成一个正方形,右下角的区域是mmult的结果区域。第1参数和第2参数的顺序不能互换。
下面看2张图片的对比。第1张图中,mmult的第1参数是橙色部分,第2参数是蓝色部分,返回的结果是绿色部分。第2张图中,mmult的第1参数是蓝色部分,第2参数是橙色部分,返回的结果是绿色部分。可以看出,当2个参数的顺序对调后,返回的结果天差地别,看绿色区域的大小就知道了。虽然2个参数的内容看起来是相同的,都是1,2,3,4,5,但由于方向的不同,返回的结果完全不同。
下面来看2个简单的例子。
1.按姓名和科目分别求总分。
下图是一张成绩表,求每个人的总分和各科的总分。对于这个问题,我相信大家会说这太简单了,一个sum就搞定了。没错,就是这么简单。但是我们要学习mmult的用法,就从简单的问题开始。咱们先看每个人的总分是怎么求出来的,也就是E列的绿色部分。
我们可以从结果区域的大小来倒推第1参数和第2参数的位置,结果的区域E4:E7是4行1列,成绩的区域B4:D7是4行3列,它的行数和结果区域的行数相同,列数和结果区域的列数不同,所以它只能是第1参数。那么我们也可以推测第2参数只有1列,并且它的行数与第1参数的列数相同。这样我们就可以画矩形图了,如下图右侧所示。
虽然矩形图画好了,但第2参数的内容还没有确定,怎么样可以知道第2参数是什么呢?其实还可以从结果倒退,因为总分是3科成绩相加,比如125=28+5+92,那么28*1+5*1+92*1是不是还是等于125。所以第2参数是{1;1;1},注意这里数组的元素用分号分隔,因为现在它是纵向的。
所以函数公式如下图所示,首先选中E4:E7,输入公式=MMULT(B4:D7,{1;1;1}),按ctrl+shift+enter三键结束,因为现在是在多单元格中输出结果。你可以再看下右侧的矩形图,看看它的计算过程。
接下来看下每科的总分是怎么算出来的,也就是橙色的区域B8:D8。你也可以自己先想一下。同样还是按之前的思路,结果区域是1行3列,成绩的区域是4行3列,所以它只能是第2参数。我们也可以推测第1参数只有1行4列,并且结果是{1,1,1,1}。然后就可以画矩形图了,如下图所示。同样选中B8:D8,输入公式=MMULT({1,1,1,1},B4:D7),多单元格输出结果,按三键结束。
mmult经常与{1;1;1;1}或{1,1,1,1,1}这样的数组结合使用,下图就是构建了一个二维数组。第2参数就是4个1组成的横向数组。数据量小的话,我们就可以像上面那样输入常量数组;但是如果数据量多的话,比如需要100个1组成的数组,那我们不可能写100次。这时就会用到row(1:100)^0或column(a:aa)^0这样的写法。row(1:100)是1到100的纵向数组,0次方就返回100个1。column也是一样的意思,由于column不好看到列数,所以也会用到transpose(row(1:100)^0)或transpose(row(1:100))^0的写法。
2.求部门为销售部,性别为男的工资总和。
如下图所示,是一个多条件求和的问题。我们知道多条件求和可以用sum,sumifs,sumproduct等,其实也可以用mmult,我们先来说一下常用的公式。sumifs的公式为=SUMIFS(D13:D22,B13:B22,"销售部",C13:C22,"男")。
sumproduct的公式为=SUMPRODUCT((B13:B22="销售部")*(C13:C22="男")*D13:D22)。也就是部门的区域等于销售部乘以性别的区域等于男再乘以工资,多条件与的关系用乘号。
如下图所示,F列是判断B列部门的区域是否等于销售部,成立的返回true,不成立的返回false。G列是判断C列性别的区域是否为男,同样成立的返回true,否则返回false。H列是这2个条件判断的结果相乘,2者同时成立的返回1,否则返回0。这样就找到符合条件的了,然后用H列的结果再乘以D列的工资,最后求和就得到了总工资。
为什么sumproduct的用法要说的这么细,因为它和mmult的用法比较接近。下图F列是三部分的乘积,之前是用sumproduct求和,现在用mmult来求和。由于求和的结果只有1个值,所以三部分相乘的结果只能作为mmult的第2参数,那么第1参数只能有1行,列数和第2参数的行数相同。可以画右侧的矩形图。由于这里第1参数中的1比较多,所以我用TRANSPOSE(ROW(13:22)^0)来构建。所以最后的公式为=MMULT(TRANSPOSE(ROW(B13:B22)^0),(B13:B22="销售部")*(C13:C22="男")*D13:D22),按ctrl+shift+enter三键结束。
除了上面的公式,还可以有多种写法,你自己可以组织搭配,但一定要符合mmult的矩形图规则。我这里给出2种作为参考。
第1种=MMULT(TRANSPOSE(D13:D22),(B13:B22="销售部")*(C13:C22="男")),按三键结束。
第2种=MMULT(TRANSPOSE((B13:B22="销售部")*D13:D22),N(C13:C22="男")),按三键结束。