【问题标题】:Multiply Matrices in DAXDAX 中的矩阵相乘
【发布时间】:2019-01-23 18:04:12
【问题描述】:

假设我有两个矩阵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 矩阵相乘作为计算表的通用计算。

【问题讨论】:

  • 我很好奇为什么你会在 Power BI 中首先使用这种奇怪格式的矩阵?
  • @FoxanNg 由于 DAX 的柱状性质,这确实是唯一对我有意义的格式。您对它们的格式有更好的建议吗?
  • 这是一个矩阵的奇怪表示
  • @AlexisOlson 我实际上建议不要首先在 Power BI 中进行矩阵乘法。现在,Power BI 中同时提供了 Python 和 R 脚本,这将是两种语言都可以做到的一种方式。虽然我不确定您的数据管道如何以及如何获取矩阵,但这可能是也可能不是最适合您的方法。
  • @FoxanNg 问题在于必须预先计算所有内容。除非您使用 DAX 或预先计算所有可能的切片器设置组合,否则您无法与切片器进行动态交互,这通常是不可行的。

标签: matrix powerbi linear-algebra matrix-multiplication dax


【解决方案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 行对,该单元格的值计算为MatrixAi 行与MatrixBj 列的和乘积。 GENERATESERIES 位只是创建一个 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))

生成表格

Index |  A  |  B
------|-----|----
 1    | -1  |  3
 2    |  2  | -1
 3    |  0  | -4

其中[A] 列是MatrixA 的第三行,[B] 列是MatrixB 的第二行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 2015-01-24
    • 2016-12-11
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多