我正在尝试将一些数组相乘,但似乎无法弄清楚该怎么做。我正在翻译来自 MatLab 的一些线性代数代码,但由于 Matlab 使用列主要索引和 Python 使用行主要索引,因此似乎无法让它在 Numpy 中正常工作。
我已经设法让矩阵相乘,但我没有得到与 Matlab 中相同的结果。
我有三个数组:
a.shape = 40x40 in Python, 40x40 in Matlab, zeroes array
b.shape = 40x21 in Python, 21x40 in Matlab, array with < 1 float values
c.shape = 31x40 in Python, 40x31 in Matlab, array with < 1 float values
我试图从 Matlab 复制的数学是:
D = b*(a*c);
disp(size(D)); % Size of D is 21x31
当我尝试对 NumPy 做同样的事情时:
D = b @ (a @ c)
它显然不起作用,因为 c 是 31x40 并且不能与 A (40x40( 相乘。
我已经设法通过使用以下命令使乘法实际工作:
D = np.transpose(np.transpose(b) @ (a @ np.transpose(c)))
但是 Numpy 中生成的 D 与 Matlab 中的 D 不同,尽管尺寸正确 (31x21(。
如果有人有任何想法如何做到这一点,或者即使不可能,请告诉我!
>不,只需用随机数运行它差异仅限于舍入误差
检查正确矩阵大小的快速简单示例:
import numpy as np
np.__version__
#'1.16.3'
a = np.ones([40,40])
b = np.ones([21,40])
c = np.ones([40,31])
#%%
a_mult_c = a @ c
a_mult_c.shape()
# (40, 31)
#%%
D = b @ a_mult_c
D.shape
# (21, 31)
有关详细的随机数示例,加载并运行这些数字
https://jsonblob.com/c240c380-81a2-11e9-8287-ef9cd282f8ed
假设您复制,粘贴并将其保存到"matrixmult.json"矩阵实验室:
fid = fopen('matrixmult.json', 'r');
values = jsondecode(fread(fid, '*char')'));
fclose(fid);
蟒:
import numpy as np
np.__version__
# '1.16.3'
import json
with open('matrixmult.json', 'r') as f: # py > 3.6
values = json.load(f)
a = np.asarray(values['a'])
b = np.asarray(values['b'])
c = np.asarray(values['c'])
D = b @ (a @ c)
D == np.asarray(values['D'])