我正在尝试将一些数组相乘,但似乎无法弄清楚该如何做。我正在翻译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)。
如果有人对如何执行此操作有任何想法,或者即使不可能,请告诉我!
答案 0 :(得分:0)
不,只是用随机数运行它 差异仅限于舍入误差
快速简单的示例检查正确的矩阵大小:
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' matlab:
fid = fopen('matrixmult.json', 'r');
values = jsondecode(fread(fid, '*char')'));
fclose(fid);
python:
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'])