Экспорт матрицы с символьными переменными из Matlab в Python

avatar
Push
8 апреля 2018 в 01:46
383
1
1

У меня есть матрица с символьной переменной в MATLAB, например:

syms x
f = [x^2 x^3 x^4];
save ('sym.mat','f')

Поэтому я сохранил матрицу f как sym.mat. Теперь я хочу импортировать эту матрицу в python. Итак, я попробовал это:

import scipy.io as sio
matrix = sio.loadmat('sym.mat')
sym = matrix['f']

Но это не сработало. Я получил эту ошибку, которая представляет собой обычный питон keyerror.

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'f'

Однако, если f не является символьной матрицей, тогда этот код работает нормально. Любые идеи, как я могу работать с этими матрицами с символическими переменными?

Источник
hpaulj
8 апреля 2018 в 04:38
0

Что такое keys из matrix? Дайте нам представление о том, что вернул loadmat. Я предполагаю, что MATLAB сохранил класс и/или функцию, которые нельзя преобразовать в структуры numpy. Я видел проблемы в предыдущих вопросах SO с функциями и датами MATLAB.

hpaulj
8 апреля 2018 в 06:28
0

Я вижу из других сообщений, что вы уже знаете о sympy. numpy и scipy не имеют никакой символической функциональности, поэтому loadmat не может вернуть эквивалент MATLAB, даже если он «понял» syms. Лучшее, что вы можете сделать, это воссоздать их в sympy.

Ответы (1)

avatar
Omar Ayman
1 июня 2020 в 18:34
1

Scipy не может загрузить символьные переменные MATLAB.

Лучший способ решить вашу проблему — преобразовать символьную матрицу в матрицу символов (не в строки Matlab, так как это тоже вызовет ошибки)

Вот что я имею в виду:

В MATLAB можно сделать что-то вроде этого:

syms x
f = [x^2 x^3 x^4];
for i = 1:numel(f)
    if i == 1
        f2 = char(f(i));
    else
        f2 = [f2 ',' char(f(i))];

    end
end

save('sym.mat','f2')

Отобразится:

x^2,x^3,x^4

Теперь в Python вы можете сделать что-то вроде этого:

import scipy.io as sio
path = 'H:\MatlabScripts'
matrix = sio.loadmat(path + '\sym.mat')
sym = matrix['f2'][0].split(',')
print(sym)

Результат будет:

['x^2', 'x^3', 'x^4']