本人线性代数学的不错的...嘿嘿,自吹一下 上面的改的形式也讲的很好,但现在还不能直接用MMULT来思考问题,现在用SUM我是可以直接用SUM来思 考的,我想这估计只能考摸爬滚打来培养感觉了。 写出SUM公式,掐行列关系整出一个MMULT的公式,说实在现在是心里没底,呵呵。 谢谢斑竹讲课。 ------------------------------------------------------------------------------------------- -------------------------------------------------------- 理了理思绪,我觉得单就这个问题我们如果从逻辑上分析通透了对我们会大有帮助,我的意思是整这个MMULT函数的时候我们不要去掐捏行列关系(我知道版主的出发点绝对是好的,给我们初学者一套可操作的步骤,但我觉得脱离了逻辑经络,使得我们不能直接用这个函数来思考,当然用多了估计也会熟悉)。以下内容为了让我们初学者能教容易的直接用这个函数来思考,来解决问题,写参数的时候心中有谱。 MMULT(array1,array2),为了以后有轻车熟路的感觉,我们给自己演练套路:把array1(I行K列,I确定的,就是结果区域的记录条数,在本例中就是F2:F22的条数=21)当成是条件矩阵,把array2(K行J列,K行是确定的,应该和原数据中的记录条数对应,本例中就是B2:B19的行数=18;这个是有一般性意义的,J其实也是确定的,就是所要条件汇总的数据字段数,本例中就一个汇总字段-数)当成是数据矩阵。于是两个矩阵相乘得到的矩阵就是满足条件的对应数据的汇总。 不熟悉这个函数的初学者会觉得上面蓝颜色的结论是有那么点跳跃,心里不踏实,有待琢磨一会,尤其对汇总两字体会不那么真切。那么让我们来扶平这份困惑... 继续看帖考试:SUM((B2:B19=F2)*(A2:A19=E2)*(C2:C19)) 是对XX=A,YY=H的 数 汇总能理解吗? 如果能理解,那么跳过下面一段,如果不能那么容我唠叨几句... 这是个很朴素的SUM数组公式,其中的三个乘积因子都是数组,方向相同的一维数组相乘仍然是一维数组,各个元素分别是乘积因子对应元素的乘积。上面的乘积因子我们也可以人为的分为条件因子和数据因子,条件因子的元素不是1(TRUE),就是0(FALSE),这样结合同向一维数组相乘的法则得到的结果数组元素不是0就是原数据因子的对应数据。(相乘 逻辑上相当于 与 ,这样就完成了多条件的逻辑任务,另外就是把不符合条件的数据剔除了--变成了0,在SUM相加求和的过程中加0对汇总总数没有贡献,所以在逻辑上相当于剔除)这样用SUM再汇总一下就是把满足条件的数据进行了汇总。 用上面的公式SUM((B2:B19=F2)*(A2:A19=E2)*(C2:C19))得出的结果是G2的值,那么怎么剖析MMULT得出G2的过程呢?这里是核心关键了,思绪象火花一样跳跃的厉害,有点把持不住了... G2在得出的那个21行1列矩阵(就是本例中的结果)的位置是 a11,其实就是array1的第一行和array2的第一列的SUM公式SUM((array1的第一行)*(array2的第一列))。同理结果矩阵的任意一项aij=sum((array1的第i行)*(array2的第j列)). 我们怎么说明这个事实呢,走.... array2的第1列=C2:C19,array1的第一行=(F2:F22=TRANSPOSE(B2:B19))*(E2:E22=TRANSPOSE(A2:A19))的 第一行=(F2=TRANSPOSE(B2:B19))*(E2=TRANSPOSE(A2:A19))=值=(B2:B19=F2)*(A2:A19=E2) 借用矩阵运算法则 aij=array1的第i行数组 和 array2的第j列数组 相对应元素相乘相加,其实就是=sum((array1的第i行数组)*(array2的第j列数组)) 如图: 体会一下array1的每一行其实就是一个条件判断。用一行条件判断去乘一列数据再求和结果就是条件汇总。
其实这个数学结果在MMULT的计算法则里面已经表达出来了,我只是借用SUM数组来进行分步走,分步理解。把数学过程的逻辑意义表达出来进行强化理解。 好了,我觉得到这一步应该解决了对上面那个结论“于是两个矩阵相乘得到的矩阵就是满足条件的对应数据的汇总。”的困惑了。 这里用了对应数据几个字本意是这样的,本例中统计的只有 数 一个数据字段,实际中更多的情况应该会有 数 ,数2,数3 这样多个数据字段,用了对应更具一般性。写公式的时候只要把array2从单列变成多列就是了。 为了方便我一样的初学者,我再补充一点背景知识:两个矩形区域的数据相乘(行列必须一样,否则就会有错误值)得到的结果是一个相同行列的矩形区域,各个元素就是相对应各个元素的乘积。为了减少误解我打个比方 矩形1区域*矩形2区域 就相当于把两个矩形贴在一起,把贴在一起的重叠单元格数据进行相乘操作,在这两个矩形上再贴一个空白的矩形,重叠单元格相乘的结果放到空白的矩形单元格里面,这个和矩阵相乘是有区别的,和同向一维数组的加 乘 操作是平行的。 如果还有要什么要做背景知识的话,我觉得就是斑竹的看帖考试:F2:F22=TRANSPOSE(B2:B19)是21行18列 对于这种 行数组(y1,y2,y3,....) "运算符" 列数组(x1,x2,x3,...)的运算我是这么形象理解的,当成一张表格 ,或者借用象限的话就是第四象限,X轴方向是列字段,Y轴负方向就是行数组,然后运算结果就是各个元素进行 "运算符"运算,结果放在坐标(xi,yj)上。那么容易理解 结果矩阵的行数就是原来行数组的行,矩阵的列数就是原来列的列数。这是对垂直向量运算的一个具体的特列表述,其实垂直向量运算就满足矩阵法则。 好了,现在来看看我们怎么样直接用MMULT来进行思考: 我们知道各个限制条件,我们知道要汇总的数据字段,我们运用套路:MMULT(array1-条件矩阵,array2- 数据矩阵)=MMULT((F2:F22=TRANSPOSE(B2:B19))*(E2:E22=TRANSPOSE(A2:A19)),C2:C19)这里把F2:F22, E2:E22写在前面是为了让思路更加的清晰,写的同时心里可以这么想 每一行就是一个条件判断,比如判断Fi=transpose(b2:b19). 所以用MMULT条件汇总的时候使用套路,条件矩阵,数据矩阵。数据矩阵原盘照抄;写条件矩阵的时候记得把结果区的单元格区域放前面,然后记得用=号时两边方向是垂直的就行了。 其实今天才算第一次和MMULT接触,还没实践过,哈哈。不过忍不住要发表,哈哈。享受丢脸。嘿嘿 胡诌一统,希望对初血者有用,千万不要看的出血呀,呵呵
[此贴子已经被作者于2007-10-25 10:04:26编辑过] |