【发布时间】:2015-09-02 06:18:15
【问题描述】:
我在 simulink 中使用 matlab 函数来调用 python 脚本,该脚本根据输入值进行一些计算。 python脚本给了我一个返回matlab函数的字符串,我将它拆分为一个数组。拆分后的字符串必须是一个包含 6 个变量字符串的元胞数组:
dataStringArray = '[[-5.01 0.09785429][-8.01 0.01284927]...' '10.0' '20.0' '80.0' '80.0' '50.0'
要使用特定的 m 文件调用 strsplit 之类的函数或 python-script 本身,我使用的是coder.extrinsic('*') 方法。
现在我想用dataStringArray(3) 来索引一个特定的值来获得'20.0'并将它定义为matlab 函数的输出值,但这不起作用!我尝试使用 dataStringArray = cell(1,6); 预定义 dataStringArray,但总是得到相同的 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 数据类型。
解决方法是将整个代码定义为普通函数,并从用 extrinsic 定义的 MATLAB-Function 执行它。在执行外部函数之前,用已知类型和大小初始化输出变量很重要。
解决方案 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));
【问题讨论】:
标签: python arrays matlab indexing simulink