Перевод умножения матриц из Matlab в Numpy - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь умножить несколько массивов вместе, но не могу понять, как это сделать.Я перевожу некоторый код линейной алгебры из MatLab и, похоже, не могу заставить его работать так же в Numpy из-за Matlab, использующего индексацию по главному столбцу, и Python, использующего индексирование по основной строке.

Мне удалосьчтобы умножить матрицы, но мне не удалось получить тот же результат, что и в 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)))

, но результирующий D в Numpy отличается от полученного в Matlab, хотяразмеры правильные (31х21).

Если у кого-то есть идеи, как это сделать, или даже если это невозможно, пожалуйста, дайте мне знать!

1 Ответ

0 голосов
/ 29 мая 2019

Нету просто запустить его со случайными числами различия ограничены ошибками округления

простой простой пример проверки правильности размеров матрицы:

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);

питон:

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'])
...