Преобразование numpy int в matlab int - PullRequest
0 голосов
/ 20 июня 2020

Я вызываю функцию Matlab в python через механизм Matlab, и у меня возникают проблемы с передачей переменных. Я понял, как передать некоторые, но при этом получаю сообщение об ошибке. должен быть скалярным целым числом. но когда я передаю его, я получаю сообщение об ошибке:

File "C: \ ProgramData \ Anaconda3 \ lib \ site-packages \ matlab_internal \ mlarray_utils.py", строка 90, в _normalize_size, если init_dims [0] == 0:

IndexError: индекс кортежа вне допустимого диапазона

Код работает нормально Если я не передаю переменную modn, поэтому я знаю, что моя проблема в тип преобразования в matlab этой переменной.

это код python:

import numpy  as np
import matlab
import matlab.engine
eng =  matlab.engine.start_matlab()

eng.cd()

Nn = 30
x= 250*np.ones((1,Nn)) 
y= 100*np.ones((1,Nn)) 
z = 32.0
xx = matlab.double(x.tolist())
yy = matlab.double(y.tolist())

f=np.arange(start=0.1,stop=0.66,step=0.1)
modnv=np.concatenate((np.ones((Nn)),2*np.ones((Nn))))

count = 0
for fks in f:
    fks=np.float(0)
    modn = modnv[count]
    modn = modn.astype(int)
    modn = matlab.int8(modn)
    Output = eng.simple_test(xx,yy,z,fks,modn,nargout=4)
    A = np.array(Output[0]).astype(float)
    B = np.array(Output[1]).astype(float)
    C = np.array(Output[2]).astype(float)
    D = np.array(Output[3]).astype(float)
    count = count + 1

и это функция matlab simple_test:

function [A,B,C,D] = simple_test(x,y,z,fks,modn)

if modn == 1
    A = 3*x+2*y;
    B = x*ones(length(x),length(x));
    C = ones(z);
    D = x*y';
else
    A = 3*fks;
    B = 3*x+2*y;
    C = A+B;
    D = x*y'
end

Кто-нибудь знаете, как это преодолеть?

1 Ответ

1 голос
/ 20 июня 2020

Всякий раз, когда вы получаете IndexError: tuple index out of range ошибку, чаще всего это:

  1. Вероятно, один из индексов неверен. Я подозреваю, что вы хотите сказать [0], где вы говорите [1] и [1], где вы говорите [2]. Индексы начинаются с 0 в Python.
  2. вы передаете массив функции, которая ожидала вариативную c последовательность аргументов (например, '{}{}'.format([1,2]) vs '{}{}'.format(*[1,2])
...