从Matlab到Numpy的矩阵乘法转换

时间:2019-05-28 22:27:19

标签: python python-3.x matlab numpy linear-algebra

我正在尝试将一些数组相乘,但似乎无法弄清楚该如何做。我正在翻译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)。

如果有人对如何执行此操作有任何想法,或者即使不可能,请告诉我!

1 个答案:

答案 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'])