Предположим, у меня есть две матрицы 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
Я бы хотел рассчитать их продукт (который демонстрируется в это видео на 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 n и n x m вместе в расчетную таблицу.
@FoxanNg Это действительно единственный формат, который имеет смысл для меня из-за столбчатой природы DAX. У вас есть лучший вариант их формата?
Вот такое странное представление матрицы
@AlexisOlson Я бы вообще посоветовал вообще не выполнять умножение матриц в Power BI. Теперь, когда в Power BI доступны сценарии Python и R, для обоих языков это будет всего лишь однострочник. Хотя я не уверен, как устроен ваш конвейер данных и как вы получаете матрицы, это может быть, а может и не быть лучшим подходом для вас.
@FoxanNg Проблема в том, что все должно быть предварительно вычислено. Вы не можете получить динамическое взаимодействие со срезами, если не используете DAX или предварительно вычислите все возможные комбинации настроек срезов, что часто невозможно.
@StelioK Это просто несведенная таблица, довольно стандартная нормализация для табличных данных.
@AlexisOlson Я никогда раньше не видел эту форму, я ее копаю!





Думаю, я понял это. Если 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 на столбец j из MatrixB. Бит 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] - это 3-я строка MatrixA, а столбец [B] - это 2-я строка MatrixB.
Мне просто любопытно, зачем вообще нужны матрицы в таком странном формате в Power BI?