首页 文章

如何在Simulink中的MATLAB函数中索引数组值?

提问于
浏览
2

我在simulink中使用matlab函数来调用python脚本,它根据输入值进行一些计算 . python脚本给了我一个回到matlab函数的字符串,我将其拆分为一个数组 . splitted字符串始终是一个包含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.

我错了什么?

SAMPLE CODE

The commented code behind the output definitions is what I need.

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));

SOLUTION 1

Matlab功能块不支持单元数组,只能使用本机Simulink数据类型 .

解决方法是将整个代码定义为普通函数,并从使用外部函数定义的MATLAB函数执行它 . 在执行外部函数之前,使用已知类型和大小初始化输出变量很重要 .

SOLUTION 2

另一种解决方案是使用 strfind 函数,它为您提供了一个带有splitter char位置的双矩阵 . 有了它,您可以只返回所需的焦点位置范围 . 在这种情况下,您的整个代码将位于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));

1 回答

  • 2

    使用外部函数时,返回的数据类型为 mxArray ,您无法将其编入索引,如错误消息所示 . 要解决此问题,首先需要初始化感兴趣的变量以将它们转换为正确的数据类型(例如,double) . 有关如何执行此操作的示例,请参阅文档中的Working with mxArrays .

    错误消息的第二部分是维度 . 在没有看到函数的代码,Simulink模型以及如何定义函数的输入/输出的情况下,它仍在继续,但您需要确保在Ports and Data manager中定义了正确的大小和数据类型 .

相关问题