在 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

我想计算他们的产品(在此YouTube视频中演示(:

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矩阵相乘为计算表。

我想我已经弄清楚了。如果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]列和具有k x m行的列[j]。对于此交叉联接表中的每个ij行对,该单元格的值计算为iMatrixAjMatrixB的总和乘积。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的第 3 行,[B]列是第 2 行MatrixB

相关内容

  • 没有找到相关文章

最新更新