代码之家  ›  专栏  ›  技术社区  ›  Alexis Olson

DAX中的乘法矩阵

  •  2
  • Alexis Olson  · 技术社区  · 8 年前

    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 作为计算表的矩阵。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Alexis Olson    8 年前

    我想我已经弄明白了。如果 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 此交叉联接表中的行对,该单元格的值计算为 基质 具有 矩阵B . 这个 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] 基质 以及 [B] 列是 .