在DAX中相乘矩阵

时间:2018-08-16 17:54:56

标签: matrix powerbi linear-algebra matrix-multiplication 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矩阵相乘,作为计算表。

1 个答案:

答案 0 :(得分:1)

我想我已经知道了。如果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创建一个新表,其中包含列[i][j],其中有k x m行。对于此交叉联接表中的每个ij行对,该单元格的值计算为i的{​​{1}}行与{{1}的总和MatrixA的}列。 j位只是创建一个MatrixB列表,其长度与匹配维度GENERATESERIES相同。

例如,当Indexn时,给定示例的中间部分为

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的第二行。