DAX 中的矩阵乘法

Multiply Matrices in DAX

假设我有两个矩阵 MatrixAMatrixB 给出如下(其中 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 nn x m 矩阵相乘作为计算的 table.

的通用计算

我想我已经明白了。如果 MatrixAk x n 并且 MatrixBn 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 中的每个 ij 行对,该单元格的值计算为 MatrixAi 行的和乘积jMatrixBGENERATESERIES 位只是创建一个 Index 列表,其长度为 n.

例如,当i = 3j = 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 行。