Ошибка умножения матрицы Clojure: «Несоответствующие размеры вектора» (clojure.core.matrix) - PullRequest
0 голосов
/ 28 июня 2019

У меня есть матрица размером [1, 10] и другая размером [1, 50] (оба вектора - один будет транспонирован), который я хочу умножить.Я могу сделать это в MATLAB, но библиотека Clojure , которую я использую, возвращает ошибку, указывающую, что векторные фигуры не совпадают.

Вот код Clojure (не выполняется)

(def A [-0.4300 0.8205 0.3060 0.7011 0.3717 0.3790 0.6332 0.6179 0.5414 0.7277])
(m/shape A)
(def B [1 4.5239 1.0 4.54133 4.17334 1.0 2.3195 1.25481 2.57760 0.999 1.71030 1.167121 0.996 1.0 1.0 1.0 1.0 2.42060 4.53421 1.0 3.81672 2.26177 1.412147 1.13449 4.22844 1.87670 1.42931 4.13310 1.0 3.06024 1.0 0.999 1.02989 8.92018 8.90729 6.60117 2.61610 7.31420 1.0 4.23987 0.999 1.05592 5.31238 1.0 1.0 0.999 7.97549 1.6177 1.0 1.0])
(m/shape B)
(m/mmul (m/transpose A) B)

Эквивалентная операция в MATLAB:

A = [-0.4300 0.8205 0.3060 0.7011 0.3717 0.3790 0.6332 0.6179 0.5414 0.7277];
size(A)
B = [1 4.5239 1.0 4.54133 4.17334 1.0 2.3195 1.25481 2.57760 0.999 1.71030 1.167121 0.996 1.0 1.0 1.0 1.0 2.42060 4.53421 1.0 3.81672 2.26177 1.412147 1.13449 4.22844 1.87670 1.42931 4.13310 1.0 3.06024 1.0 0.999 1.02989 8.92018 8.90729 6.60117 2.61610 7.31420 1.0 4.23987 0.999 1.05592 5.31238 1.0 1.0 0.999 7.97549 1.6177 1.0 1.0];
size(B)
C = A' * B;
size(C)

Очевидно, что операция математически возможна - она ​​должна возвращать матрицу [10, 50] ... есть ли ошибка в способе, которым я реализовал вычислениеили это ошибка?

Ответы [ 2 ]

3 голосов
/ 28 июня 2019
(let [A [[-0.4300 0.8205 0.3060 0.7011 0.3717 0.3790 0.6332 0.6179 0.5414 0.7277]]
      B [[1 4.5239 1.0 4.54133 4.17334 1.0 2.3195 1.25481 2.57760 0.999 1.71030 1.167121 0.996 1.0 1.0 1.0 1.0 2.42060 4.53421 1.0 3.81672 2.26177 1.412147 1.13449 4.22844 1.87670 1.42931 4.13310 1.0 3.06024 1.0 0.999 1.02989 8.92018 8.90729 6.60117 2.61610 7.31420 1.0 4.23987 0.999 1.05592 5.31238 1.0 1.0 0.999 7.97549 1.6177 1.0 1.0]]]
    (mmul (transpose A) B))

[2 3 5] - это не матрица, а вектор.

[[2 3 5]] - это матрица.

2 голосов
/ 28 июня 2019

Согласно документации mmul, транспонирование подразумевается в векторе в зависимости от положения аргумента:

Выполняет умножение матриц на матрицах или векторах.Эквивалентен внутреннему произведению применительно к векторам.Примерно будет рассматривать 1D вектор как матрицу 1xN (вектор строки), когда это первый аргумент, или как матрицу Nx1 (вектор столбца), когда это второй аргумент, за исключением того, что размерность результата будет отличаться от того, что было быбыть с аргументами матрицы.

Таким образом, вы не должны транспонировать себя.

...