DAX 中的矩阵乘法
Multiply Matrices in DAX
假设我有两个矩阵 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
矩阵相乘作为计算的 table.
的通用计算
我想我已经明白了。如果 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
创建了一个新的 table,其列 [i]
和 [j]
具有 k x m
行。对于此交叉连接 table 中的每个 i
和 j
行对,该单元格的值计算为 MatrixA
的 i
行的和乘积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))
生成 table
Index | A | B
------|-----|----
1 | -1 | 3
2 | 2 | -1
3 | 0 | -4
其中 [A]
列是 MatrixA
的第 3 行,[B]
列是 MatrixB
的第 2 行。
假设我有两个矩阵 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
矩阵相乘作为计算的 table.
我想我已经明白了。如果 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
创建了一个新的 table,其列 [i]
和 [j]
具有 k x m
行。对于此交叉连接 table 中的每个 i
和 j
行对,该单元格的值计算为 MatrixA
的 i
行的和乘积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))
生成 table
Index | A | B
------|-----|----
1 | -1 | 3
2 | 2 | -1
3 | 0 | -4
其中 [A]
列是 MatrixA
的第 3 行,[B]
列是 MatrixB
的第 2 行。