Я использую функцию matlab в simulink для вызова скрипта python, который выполняет некоторые вычисления из входных значений. Сценарий python возвращает мне строку обратно в функцию matlab, которую я разделяю на массив. Разделенная строка всегда должна быть массивом ячеек с 6 строками переменных:
dataStringArray = '[[-5.01 0.09785429][-8.01 0.01284927]...' '10.0' '20.0' '80.0' '80.0' '50.0'
Для вызова таких функций, как strsplit или самого python-скрипта с определенным m-файлом, я использую метод coder.extrinsic('*')
.
Теперь я хочу проиндексировать определенное значение, например, с помощью dataStringArray(3)
, чтобы получить «20,0» и определить его как выходное значение функции matlab, но это не работает! Я пытался предопределить dataStringArray с помощью dataStringArray = cell(1,6);
, но всегда получаю одни и те же 4 ошибки:
Subscripting into an mxArray is not supported.
Function 'MATLAB Function' (#23.1671.1689), line 42, column 24:
"dataStringArray(3)"
2x Errors occurred during parsing of MATLAB function 'MATLAB Function'
Error in port widths or dimensions. Output port 1 of 's_function_Matlab/MATLAB Function/constIn5' is a one dimensional vector with 1 elements.
Что я не так?
ОБРАЗЕЦ КОДА
Закомментированный код выходных определений — это то, что мне нужно.:
function [dataArrayOutput, constOut1, constOut2, constOut3, constOut4, constOut5] = fcn(dataArrayInput, constIn1, constIn2, constIn3, constIn4, constIn5)
coder.extrinsic('strsplit');
% Python-Script String Output
pythonScriptOutputString = '[[-5.01 0.088068861]; [-4.96 0.0]]|10.0|20.0|80.0|80.0|50.0';
dataStringArray = strsplit(pythonScriptOutputString, '|');
% Outputs
dataArrayOutput = dataArrayInput; % str2num(char((dataStringArray(1))));
constOut1 = constIn1; % str2double(dataStringArray(2));
constOut2 = constIn2; % str2double(dataStringArray(3));
constOut3 = constIn3; % str2double(dataStringArray(4));
constOut4 = constIn4; % str2double(dataStringArray(5));
constOut5 = constIn5; % str2double(dataStringArray(6));
РЕШЕНИЕ 1
Массивы ячеек не поддерживаются в функциональных блоках Matlab, возможны только собственные типы данных Simulink.
Обходной путь состоит в том, чтобы определить весь код как обычную функцию и выполнить его из функции MATLAB, определенной с помощью extrinsic. Перед выполнением внешней функции важно инициализировать выходные переменные с известным типом и размером.
РЕШЕНИЕ 2
Другим решением является использование функции strfind
, которая дает вам двойную матрицу с позицией символа-разделителя. При этом вы можете вернуть только тот диапазон позиций символов, который вам нужен. В этом случае весь ваш код будет находиться в блоке MATLAB-Function.
function [dataArrayOutput, constOut1, constOut2, constOut3, constOut4, constOut5] = fcn(dataArrayInput, constIn1, constIn2, constIn3, constIn4, constIn5)
coder.extrinsic('strsplit', 'str2num');
% Python-Script String Output
pythonScriptOutputString = '[[-5.01 0.088068861]; [-4.96 0.0]; [-1.01 7.088068861]]|10.0|20.0|80.0|80.0|50.0';
dataStringArray = strfind(pythonScriptOutputString,'|');
% preallocate
dataArrayOutput = zeros(3, 2);
constOut1 = 0;
constOut2 = 0;
constOut3 = 0;
constOut4 = 0;
constOut5 = 0;
% Outputs
dataArrayOutput = str2num(pythonScriptOutputString(1:dataStringArray(1)-1));
constOut1 = str2num(pythonScriptOutputString(dataStringArray(1)+1:dataStringArray(2)-1));
constOut2 = str2num(pythonScriptOutputString(dataStringArray(2)+1:dataStringArray(3)-1));
constOut3 = str2num(pythonScriptOutputString(dataStringArray(3)+1:dataStringArray(4)-1));
constOut4 = str2num(pythonScriptOutputString(dataStringArray(4)+1:dataStringArray(5)-1));
constOut5 = str2num(pythonScriptOutputString(dataStringArray(5)+1:end));
dataStringArray = ones(1,6);
данные будут инициализированы массивом двойников, а не строк. Для строк вы, вероятно, захотите попробовать что-то вродеdataStringArray = '';
17.06.2015dataStringArray = '';
, но получаю ошибкуIndex expression out of bounds
. Когда я инициализирую его с помощьюdataStringArray = '123456';
, я получаю другие ошибки. Я действительно смущен сейчас. 17.06.2015dataStringArray
в'123456'
? Это всегда размер 6? 17.06.2015dataStringArray = cell(1,6)
, но это не работает, и я получаю ошибки, упомянутые в моем вопросе. Когда я инициализирую его с помощьюdataStringArray = '123456'
, я получаю ошибкуMATLAB expression 'strsplit' is not numeric.
. 17.06.2015dataStringArray = cell(1,6);
должен помочь. Учитывая, что это массив ячеек, вам нужно проиндексировать его какstr2double(dataStringArray{2});
(обратите внимание на фигурные скобки) 17.06.2015Varargin or varargout expected. For code generation, cell array indexing is only supported for varargin and varargout.
17.06.2015