假设我有两个矩阵MatrixA
,MatrixB
给出如下(其中i
是行号,j
是列号:
MatrixA | MatrixB
i | j | val | i | j | val
---|---|---- | ---|---|----
1 | 1 | 3 | 1 | 1 | 2
1 | 2 | 5 | 1 | 2 | 3
1 | 3 | 9 | 2 | 1 | 7
2 | 1 | 2 | 2 | 2 | -1
2 | 2 | 1 | 3 | 1 | 0
2 | 3 | 3 | 3 | 2 | -4
3 | 1 | 3 |
3 | 2 | -1 |
3 | 3 | 2 |
4 | 1 | 0 |
4 | 2 | 7 |
4 | 3 | 6 |
在更熟悉的形式中,它们看起来像这样:
MatrixA = 3 5 9 MatrixB = 2 3
2 1 3 7 -1
-1 2 0 0 -4
7 0 6
我想计算他们的产品(在此YouTube视频中演示(:
Product = 41 -32
11 -7
12 -5
14 -3
在我之前使用的非透视列形式中,这是
i | j | val
---|---|----
1 | 1 | 41
1 | 2 | -32
2 | 1 | 11
2 | 2 | -7
3 | 1 | 12
3 | 2 | -5
4 | 1 | 12
4 | 2 | -3
我正在寻找一种通用计算,它将任何兼容的k x n
和n x m
矩阵相乘为计算表。
我想我已经弄清楚了。如果MatrixA
k x n
并且MatrixB
是n x m
维的:
Product =
ADDCOLUMNS(
CROSSJOIN(VALUES(MatrixA[i]), VALUES(MatrixB[j])),
"val",
SUMX(
ADDCOLUMNS(
SELECTCOLUMNS(GENERATESERIES(1, DISTINCTCOUNT(MatrixA[j])), "Index", [Value]),
"A", LOOKUPVALUE(MatrixA[val], MatrixA[i], [i], MatrixA[j], [Index]),
"B", LOOKUPVALUE(MatrixB[val], MatrixB[i], [Index], MatrixB[j], [j])),
[A] * [B]))
该CROSSJOIN
创建一个包含列的新表,其中包含[i]
列和具有k x m
行的列[j]
。对于此交叉联接表中的每个i
和j
行对,该单元格的值计算为i
行MatrixA
与j
列MatrixB
的总和乘积。GENERATESERIES
位只是创建一个Index
列表,该列表的长度为匹配维度n
。
例如,当i = 3
和j = 2
时,给定示例的中间部分是
ADDCOLUMNS(
SELECTCOLUMNS(GENERATESERIES(1, DISTINCTCOUNT(MatrixA[j])), "Index", [Value]),
"A", LOOKUPVALUE(MatrixA[val], MatrixA[i], 3, MatrixA[j], [Index]),
"B", LOOKUPVALUE(MatrixB[val], MatrixB[i], [Index], MatrixB[j], 2))
生成表
Index | A | B
------|-----|----
1 | -1 | 3
2 | 2 | -1
3 | 0 | -4
其中[A]
列是MatrixA
的第 3 行,[B]
列是第 2 行MatrixB
。