умножение матриц с oct2py

Я использую oct2py для запуска функции октавы с помощью python. Это работает, но я получаю сообщение об ошибке, когда пытаюсь умножить 2 матрицы. Что я могу сделать, чтобы решить проблему?

это пример функции Matlab

%% MATLAB
function lol = jk2(arg1,arg2)
    arg1 = arg1;
    arg2 = arg2;
    lol = arg1*arg2;

end

это код для вызова функции

import oct2py
from oct2py import octave
a=3
b=4
octave.call("/MATLAB/jk2.m",a,b) # this call works
a=np.array([[1,2],[3,4]])
b=np.array([[5,6],[1,2]])
octave.call("/MATLAB/jk2.m",a,b) # this call report an errors 

Это сообщение об ошибке

>>> octave.call("/home/donbeo/Documents/MATLAB/jk2.m",a,b)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/oct2py-1.2.0-py2.7.egg/oct2py/session.py", line 210, in call
    resp = self._eval(cmd, verbose=verbose)
  File "/usr/local/lib/python2.7/dist-packages/oct2py-1.2.0-py2.7.egg/oct2py/session.py", line 350, in _eval
    return self._session.evaluate(cmds, verbose, log, self.logger)
  File "/usr/local/lib/python2.7/dist-packages/oct2py-1.2.0-py2.7.egg/oct2py/session.py", line 523, in evaluate
    raise Oct2PyError(msg)
oct2py.utils.Oct2PyError: Oct2Py tried to run:
"""
[a__] = jk2(A__, B__)
"""
Octave returned:
binary operator '*' not implemented for 'int64 matrix' by 'int64 matrix' operations
>>> 

person Donbeo    schedule 17.01.2014    source источник
comment
Мне нравятся имена переменных здесь :)   -  person benathon    schedule 31.01.2016


Ответы (1)


Вот пример того, как грань между Python и Octave становится размытой. Numpy интерпретирует ваши массивы как целочисленные (поскольку нет явных чисел с плавающей запятой), но Octave будет рассматривать массивы как двойные. Если вы добавите точку где-нибудь в определениях вашего массива, все это будет работать.

Исправленный (проверенный) пример:

from oct2py import octave
import numpy as np
a = np.array([[1, 2], [3, 4.]])  # notice the addition of the period
b = np.array([[5, 6], [1, 2], dtype=float])  # another way to specify floating point type
octave.call("/MATLAB/jk2.m", a, b)  # this call works just fine
person Steven Silvester    schedule 17.01.2014
comment
Спасибо, это работает хорошо. В более сложном примере мне пришлось передать одно значение как float. например 3. вместо 3 - person Donbeo; 18.01.2014