Как получить данные из типа данных Python, возвращаемых в MATLAB? - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть такой скрипт на python:

import numpy as np

def my_function(x):
    return np.array([x])

И у меня есть скрипт MATLAB для его вызова:

clear all;
clc;
if count(py.sys.path,'') == 0
    insert(py.sys.path,int32(0),'');
end

myfunction_results = py.python_matlab_test.my_function(8);
display(myfunction_results);

И он отображает:

myfunction_results = 

  Python ndarray with properties:

           T: [1×1 py.numpy.ndarray]
        base: [1×1 py.NoneType]
      ctypes: [1×1 py.numpy.core._internal._ctypes]
        data: [1×8 py.buffer]
       dtype: [1×1 py.numpy.dtype]
       flags: [1×1 py.numpy.flagsobj]
        flat: [1×1 py.numpy.flatiter]
        imag: [1×1 py.numpy.ndarray]
    itemsize: 8
      nbytes: 8
        ndim: 1
        real: [1×1 py.numpy.ndarray]
       shape: [1×1 py.tuple]
        size: 1
     strides: [1×1 py.tuple]

    [8.]

Но я не знаю, как на самом деле получить данные из этого объекта.Тип py.numpy.ndarray, но я хочу использовать его в MATLAB в качестве массива или матрицы, или целого числа, или чего-то еще.КАК преобразовать его в один из этих типов?

Я смотрел на них: https://www.mathworks.com/help/matlab/examples/call-python-from-matlab.html https://www.mathworks.com/matlabcentral/answers/216498-passing-numpy-ndarray-from-python-to-matlab https://www.mathworks.com/help/matlab/matlab_external/use-matlab-handle-objects-in-python.html

Некоторые ответыпредложить записать в файл .mat.Я не хочу писать в файл.Это должно быть в состоянии запускаться в реальном времени, и запись в файл сделает его очень медленным по очевидным причинам.

Похоже, что здесь есть ответ: «Преобразование» массивов Numpy в Matlab и тискиВерсия , которая показывает

shape = cellfun(@int64,cell(myfunction_results.shape));
ls = py.array.array('d',myfunction_results.flatten('F').tolist());
p = double(ls);

Но я должен сказать, что это очень громоздко .... Есть ли более простой способ?

1 Ответ

0 голосов
/ 13 февраля 2019

В настоящее время не существует простого способа преобразования NumPy ndarray в массив Matlab, но следующая функция Matlab может выполнить преобразование:

function A = np2mat(X, tp)
% Convert NumPy ndarray to a Matlab array
if nargin < 2
    tp = 'd';
end
sz = int32(py.array.array('i', X.shape));
if strcmp(tp, 'd')
    A = reshape(double(py.array.array(tp,X.flatten('F'))), sz);
elseif strcmp(tp, 'i')
    A = reshape(int32(py.array.array(tp,X.flatten('F'))), sz);
else
    error('Unknown data type')
end

Тип данных по умолчанию - double, укажите аргумент tp='i' дляпреобразовать массив целых чисел.

...