假设我有两个矩阵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
我想计算他们的乘积(在this YouTube video中进行了演示):
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
矩阵相乘,作为计算表。
答案 0 :(得分:1)
我想我已经知道了。如果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]
和[j]
,其中有k x m
行。对于此交叉联接表中的每个i
和j
行对,该单元格的值计算为i
的{{1}}行与{{1}的总和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
的第二行。