Сообщение об ошибке говорит вам, что numpy.dot
не знает, что делать с матрицей (1x1) и матрицей (4x1). Однако, поскольку в вашей формуле вы говорите только, что хотите умножить, я предполагаю, что вы просто хотите умножить скаляр от скалярного произведения (a, b), на которое нужно умножить вектор, выходящий из произведения матрицы на вектор (Ma). Для этого вы можете просто использовать *
в python.
Итак, ваш пример будет:
import numpy.matlib
import numpy as np
def complicated_matrix_function(M, a, b):
ans1 = np.dot(a, b)
ans2 = np.dot(M, a.T)
out = ans1 * ans2
return out
M = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
a = np.array([[1, 1, 0]])
b = np.array([[-1], [2], [5]])
ans = complicated_matrix_function(M, a, b)
print(ans)
print()
print("The size is: ", ans.shape)
, что приведет к
[[ 3]
[ 9]
[15]
[21]]
The size is: (4, 1)
Примечание
Обратите внимание, что numpy.dot
много сделает interpretation
, чтобы выяснить, что вы хотите сделать. Поэтому, если вам не требуется, чтобы ваш результат был размером (4,1), вы можете упростить все до:
import numpy.matlib
import numpy as np
def complicated_matrix_function(M, a, b):
ans1 = np.dot(a, b)
ans2 = np.dot(M, a) # no transpose required
out = ans1 * ans2
return out
M = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
a = np.array([1, 1, 0]) # no extra [] required
b = np.array([-1, 2, 5]) # no extra [] required
ans = complicated_matrix_function(M, a, b)
print(ans)
print()
print("The size is: ", ans.shape)
, что приведет к
[ 3 9 15 21]
The size is: (4,)