矩阵乘积函数mmult进阶应用7:条件计数
小伙伴们,大家好。今天继续来说mmult在条件计数中的应用,还是来看两个例子。
1.计算晚点次数(抵达时间大于预计时间)
下图是一个时刻表,记录的是预计到达时间和实际到达时间。现在的问题是求出晚点的次数,当抵达时间大于预计时间就晚点了。下图中已经用黄色标出了,共有5次。这个问题没啥难度,用sum就可以完成。公式为=SUM(N(A3:A12>B3:B12)),三键结束。如果用mmult来完成,公式为=MMULT(TRANSPOSE(ROW(3:12)^0),N(A3:A12>B3:B12)),三键结束。
mmult的第1参数TRANSPOSE(ROW(3:12)^0)返回的结果是横向的10个1,ROW(3:12)^0返回纵向的10个1,用transpose转置一下就是横向的10个1。第2参数N(A3:A12>B3:B12)就是用抵达时间和预计时间进行大于的比较,返回的结果是逻辑值,n函数将逻辑值转为数值。这两个参数返回的结果分别如下图①和②所示。
2.求完全没有晚点的航班数量
如下图所示,在上个题目的基础上增加了航班的条件。现在的要求是计算完全没有晚点的航班数量,也就是一次都没有晚点的航班数量。现在共有4个航班,分别是A,B,C,D。其中航班A,C,D出现晚点的次数分别是1,2,1,如黄色所示。只有B航班一次晚点也没有出现,所以完全没有晚点的航班数量只有1个。题意弄明白了,题目该怎么做呢?
其实,这个题目的难度在于求出每个航班晚点的总次数,比如A航班飞行了3次,共有1次晚点;C航班飞行了3次,共有2次晚点。有个求总和的过程,所以要用到mmult。公式为=SUM((MMULT(N(A16:A25=TRANSPOSE(A16:A25)),N(B16:B25>C16:C25))=0)*(MATCH(A16:A25,A16:A25,)=ROW(16:25)-15)),三键结束。
公式有点长,实际上要分为2部分,第1部分是用mmult求每个航班晚点的总次数;第2部分是用match=row的套路来求不重复的个数。最后将两部分相乘就能得到我们想要的结果。
先来看mmult的部分,它的第1参数N(A16:A25=TRANSPOSE(A16:A25))返回1个正方形矩阵,如下图array1所示,也就是用纵向的航班和转置后横向的航班进行相等的比较,n函数将逻辑值返回数值。结果为1的就是相等的,结果为0的就是不相等的。
第2参数N(B16:B25>C16:C25)就是判断抵达时间是否大于预计时间,也就是判断是否晚点。如果成立返回true,不成立返回false。用n函数转化后,成立的返回1,不成立的返回0。结果如上图array2所示,标黄色的就是晚点的。
接下来用mmult对这2个参数进行矩阵相乘,可以参考下图的矩形图。返回的结果如④所示,我把这个结果也放在D列橙色的部分,这样就得到了每个航班晚点的总次数,可以按行的方向一一对应。比如A航班共晚点1次,C航班共晚点2次。其实我们要的是没有晚点的,也就是晚点总次数是0次的,只有B航班是符合的,如红色框所示。但是B航班有重复的,所以还要去重复。
=MATCH(A16:A25,A16:A25,)=ROW(16:25)-15返回的结果如下图E列所示,第1次出现的航班返回true,如红色框所示,重复出现的返回false。有关match=row的套路之前也说过很多次了,就不详细说明了。其实最后满足条件的只有第20行的B航班,因为mmult返回的结果还要等于0。
下图D列是用上图D列等于0返回的结果,也就是让mmult返回的结果等于0,这样的话,只有B航班返回true。F列是D列和E列相乘返回的结果,可以看到只有第20行的B航班满足条件,它符合完全没有晚点并且还不重复。最后用sum对F列的结果求和就可以了。
我能想到的另外一种方法是=SUM(--ISNA(MATCH(IF(MATCH(A16:A25,A16:A25,)=ROW(16:25)-15,A16:A25),IF(B16:B25>C16:C25,A16:A25),))),三键结束。大家也可以想想其他的方法。
文件链接:
https://pan.baidu.com/s/1Ui3-gXwWrVVFQ1CB_cv8iQ
提取码:rg33