【问题标题】:How to index an array value in a MATLAB-Function in Simulink?如何在 Simulink 的 MATLAB 函数中索引数组值?
【发布时间】: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


    【解决方案1】:

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

    错误消息的第二部分是一个维度。没有看到函数的代码、Simulink 模型以及函数的输入/输出是如何定义的,很难知道发生了什么,但您需要确保在 @987654322 中定义了正确的大小和数据类型@。

    【讨论】:

    • 感谢您的快速响应!我阅读了文档并尝试初始化变量,但它不适用于具有 cell() 方法的字符串数组。当我写“dataStringArray = one(1,6);”时例如,然后函数编译但我得到一个运行时错误,因为当然错误的数据类型。当我注释掉索引行“dataStringArray(3)”时,我没有收到任何错误。
    • 再一次,你不共享你的代码,所以很难找出发生了什么,但dataStringArray = ones(1,6); 的声音会将数据初始化为一个双精度数组,而不是字符串。对于字符串,您可能想尝试dataStringArray = '';
    • 我在我的问题中添加了一个基本代码示例。我试过dataStringArray = '';,但得到错误Index expression out of bounds。当我用dataStringArray = '123456'; 初始化它时,我得到另一个错误。我现在真的很困惑。
    • dataStringArray 初始化为'123456' 时遇到什么错误?它总是大小为 6 吗?
    • 它必须是一个始终包含 6 个可变大小字符串的元胞数组。所以像dataStringArray = cell(1,6) 这样的东西,但这不起作用,我得到了我的问题中提到的错误。当我用dataStringArray = '123456' 初始化它时,我得到MATLAB expression 'strsplit' is not numeric. 错误。
    猜你喜欢
    • 2021-09-22
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多