矩阵乘积函数mmult应用3:累加求和
小伙伴们,大家好。今天来说下mmult的累加求和,累加求和的用处也是挺大的。下面看几个例子吧。
1.计算每天的库存量
下图是一个入库记录表,现在要计算每天的库存量,库存量的计算方法是当天的入库量加上之前余下的库存量,比如5月19日的库存量36就等于当天的入库量17加上5月18日余下的库存量19,这是个累加求和的问题。如果只是单单解决这个问题,相信你会有很多方法,比如=SUM(B$3:B3)下拉,=B3+N(C2)下拉,根本用不上mmult。之所以用mmult完成,是用简单的题目打好基础,为以后做准备。
选中C3:C12,输入公式=MMULT(N(ROW(1:10)>=COLUMN(A:J)),B3:B12),按三键结束,用区域数组的方式返回结果。
mmult第1参数N(ROW(1:10)>=COLUMN(A:J))返回的结果如下图array1所示,是个正方形区域,并且沿对角线分割成2个三角形。ROW(1:10)是纵向的1到10,COLUMN(A:J)是横向的1到10。ROW(1:10)>=COLUMN(A:J)返回的是true和false组成的正方形区域,n把逻辑值true和false转为1和0。大家可以自己比较。
第2参数是B列的入库量B3:B12,如上图array2所示。接下来就是用mmult矩阵相乘,大家可以想想之前说过的矩形图。mmult返回结果的第1个元素19就是用第1参数的第1行和第2参数对应相乘,1*19+0*17+0*...=19;第2个元素36就是用第1参数的第2行和第2参数对应相乘,1*19+1*17+0*52+0*...=36,以此类推,这样的话就刚好得到累加的结果。
还可以用offset的多维引用来完成,公式为=SUMIF(OFFSET(B3,,,ROW(1:10)),"<>"),同样是区域数组公式。
2.计算每天的库存量(增加了出库量)
在上一个题的基础上增加了出库量。那么库存量的计算方法就是当天的入库量减去出库量再加上之前剩余的库存量。还是以5月19日为例说明,库存量16=17-5+4。如果只是单单解决这个题目,还是不难。但是如果用区域数组的方式返回结果,就有点难度了。同样选中D17:D26,输入公式=MMULT(N(ROW(1:10)>=COLUMN(A:J)),B17:B26-C17:C26),按三键结束。
mmult的第1参数N(ROW(1:10)>=COLUMN(A:J))还是不变,和上个题目一样;第2参数为B17:B26-C17:C26,就是用B列的入库量减去C列的出库量,得到每天的净入库量;2个参数返回的结果如下。然后用mmult对净入库量累计求和,就可以得到每天的库存量,这个思路挺奇特的。
当然,也可以用累加的入库量减去累加的出库量来完成,公式为=MMULT(MMULT(N(ROW(1:10)>=COLUMN(A:J)),B17:C26),{1;-1})。这里用了2个mmult,第1个是对入库量和出库量这2列数据分别累加,第2个是对累加后的2列数据相减,也就是累加的入库量减去累加的出库量。思路不同,公式的写法也不一样。
用offset的多维引用来完成,公式为=SUMIF(OFFSET(B17,,,ROW(1:10)),"<>")-SUMIF(OFFSET(C17,,,ROW(1:10)),"<>"),还是累加的入库量减去累加的出库量。
offset和mmult的结合,公式为=MMULT(SUMIF(OFFSET(B17,,{0,1},ROW(1:10)),"<>"),{1;-1}),还是累加的入库量减去累加的出库量。
3.计算A仓库每天的库存量(增加了仓库)
在上一题的基础上又增加了仓库的条件,以5月20日为例说明,由于当天A仓库没有出入库记录,所以它的库存量不变,还保持为上一次的库存量22。如果用常规的方法,还是不难。但咱们依然用区域数组的方法。选中E31:E40,输入公式=MMULT(N(ROW(1:10)>=COLUMN(A:J)),(B31:B40="A")*(C31:C40-D31:D40)),按三键完成。
还是沿用上一个题目的方法,mmult的第1参数N(ROW(1:10)>=COLUMN(A:J))不变,返回一个正方形区域;第2参数(B31:B40="A")*(C31:C40-D31:D40)返回A仓库每天的净入库量;2个参数返回的结果如下图所示。然后用mmult对A仓库的净入库量累加求和,就得到了A仓库每天的库存量。
用A仓库累加的入库量减去累加的出库量来完成,公式为=MMULT(MMULT(N(ROW(1:10)>=COLUMN(A:J)),(B31:B40="A")*C31:D40),{1;-1}),还是用了2个mmult,第1个对A仓库的入库量和出库量分别累加,第2个用A仓库累加的入库量减去累加的出库量。
用offset的多维引用来完成,公式为=SUMIF(OFFSET(B31,,,ROW(1:10)),"A",OFFSET(C31,,,ROW(1:10)))-SUMIF(OFFSET(B31,,,ROW(1:10)),"A",OFFSET(D31,,,ROW(1:10)))。
offset和mmult的结合,公式为=MMULT(SUMIF(OFFSET(B31,,,ROW(1:10)),"A",OFFSET(C31,,{0,1},ROW(1:10))),{1;-1})。
还有最后一个最难的问题,留给明天吧。
总结一下:都是区域的时候,用offset和mmult都可以累加求和。但随着条件的增加,offset的局限性和难度会越来越大,公式也会越来越长;而相对来说mmult就会好很多,虽然难度也在增加,公式也在变长,但总体来说比offset要好很多。
还有今天的公式返回的结果都是数组,所以要以多单元格区域的方式输出结果,按三键完成。以区域数组输出结果的好处是不用管相对引用,绝对引用和混合引用的问题,还有就是运算速度会相对快一点。
文件链接:
https://pan.baidu.com/s/1swx-RfeMZxGcqSmw8mto3Q
提取码:efzr