基于布尔与标量数组生成复合标量乘积数组的Excel公式方案咨询
高效计算行向累积乘积的Excel单单元格公式方案
任务
基于输入的布尔值数组与标量数组,输出标量乘积数组。
要求
- 解决方案需为单单元格公式,禁止使用VBA
- 支持动态适配不同输入数组
输入说明
输入数组A(布尔值)
| >= | 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|---|
| 2023 | 1 | 0 | 0 | 0 |
| 2024 | 1 | 1 | 0 | 0 |
| 2025 | 1 | 1 | 1 | 0 |
| 2026 | 1 | 1 | 1 | 1 |
输入数组B(标量值)
| 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|
| 1.25 | 1 | 1.2 | 1.05 |
| 1.35 | 1.1 | 1 | 1.2 |
| 1.25 | 1.15 | 1.05 | 1.05 |
| 1.3 | 1 | 1.1 | 1.15 |
| 1.25 | 1.1 | 1.4 | 1.35 |
输出说明
输出数组(复合标量)
| 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|
| 1.25 | 1.25 | 1.5 | 1.575 |
| 1.35 | 1.485 | 1.485 | 1.782 |
| 1.25 | 1.4375 | 1.509375 | 1.58484375 |
| 1.3 | 1.3 | 1.43 | 1.6445 |
| 1.25 | 1.375 | 1.925 | 2.59875 |
实际逻辑
输出数组的每一列对应输入数组B当前列及之前所有列的行向累积乘积:
- 第一列仅为B数组2023年的标量值
- 第三列为B数组每行中2023、2024、2025年的标量乘积(例如第一行第三列值为
1.25*1*1.2) - 输出数组与B数组列数完全一致
注意事项
- 输入数组A仅需通过布尔值标记每行需参与相乘的元素,格式可按需调整
- 输入数组B必须保持给定的原始形式
现有问题
使用MAKEARRAY()的暴力遍历方案,在B数组包含数千行时运行效率极低,需寻求高效的单单元格公式解决方案。
高效解决方案
利用对数转换+矩阵运算的思路,将乘法转化为加法实现高效计算,公式如下:
=EXP(MMULT(--(COLUMN(B1:E5)>=TRANSPOSE(COLUMN(B1:E5))),LN(B1:E5)))
公式拆解
COLUMN(B1:E5)>=TRANSPOSE(COLUMN(B1:E5)):自动生成与数组A逻辑一致的布尔矩阵,标记每行中当前列及之前的所有列(即需要相乘的范围)LN(B1:E5):将标量值转换为对数,把乘法运算转化为加法运算,大幅降低计算复杂度MMULT(...):通过矩阵乘法完成每行的对数累加,得到累积和矩阵EXP(...):将对数累积和还原为原始的累积乘积,得到最终输出数组
适配方法
只需将公式中的B1:E5替换为你的实际B数组区域即可,公式会自动适配区域的行数列数,无需手动调整范围。
内容的提问来源于stack exchange,提问作者mintti
相关产品推荐
相关产品推荐

