Matrix DAX中的乘法矩阵
假设我有两个矩阵Matrix DAX中的乘法矩阵,matrix,powerbi,linear-algebra,matrix-multiplication,dax,Matrix,Powerbi,Linear Algebra,Matrix Multiplication,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 | -
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
我想计算他们的产品(如中所示):
在我前面使用的unpivoted列表单中,这是
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
矩阵相乘,作为一个计算表。我想我已经算出了。如果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
行对,该单元格的值计算为i
行MatrixA
与MatrixB
的j
列的和积。GENERATESERIES
位只创建一个索引
列表具有匹配维度长度的
例如,当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]
列是矩阵xb的第二行
我只是好奇为什么在幂BI中会有如此奇怪格式的矩阵?@FoxanNg由于DAX的列性质,它确实是唯一对我有意义的格式。你对它们的格式有更好的建议吗?这是矩阵的一种奇怪表示形式@AlexisOlson我实际上建议不要在Power BI中首先进行矩阵乘法。现在,Power BI中既有Python脚本,也有R脚本,这两种语言都只需要一行代码就可以实现。虽然我不确定数据管道是如何进行的,以及如何获得矩阵,但这可能是最好的方法,也可能不是最好的方法@FoxanNg这方面的问题是,所有内容都必须预先计算。除非使用DAX或预先计算所有可能的切片器设置组合,否则无法与切片器进行动态交互,这通常是不可行的。
Index | A | B
------|-----|----
1 | -1 | 3
2 | 2 | -1
3 | 0 | -4