2014-01-17 4 views
1

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

это образец 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 
>>> 
+0

Я люблю имена переменных здесь :) – portforwardpodcast

ответ

2

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

Fixed (испытано) пример:

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 
+0

Спасибо, что хорошо работает. В более сложном примере я был вынужден передать одно значение как float. например 3. вместо 3 – Donbeo

Смежные вопросы