簡體   English   中英

如何在 Simulink 的 MATLAB 函數中索引數組值?

[英]How to index an array value in a MATLAB-Function in Simulink?

我在 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 腳本本身等函數,我使用coder.extrinsic('*')方法。

現在我想索引到一個特定的值,例如使用dataStringArray(3)來獲取 '20.0' 並將其定義為 matlab 函數的輸出值,但這不起作用! 我試圖用dataStringArray = cell(1,6);預定義 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 數據類型是可能的。

一種解決方法是將整個代碼定義為普通函數,並從用 extrinsic 定義的 MATLAB-Function 執行它。 在執行外部函數之前,使用已知類型和大小初始化輸出變量非常重要。

解決方案 2

另一種解決方案是使用strfind函數,它為您提供一個帶有分隔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));

使用外部函數時,返回的數據類型為mxArray ,您無法按照錯誤消息的建議對其進行索引。 要解決此問題,您首先需要初始化感興趣的變量以將它們轉換為正確的數據類型(例如雙精度)。 有關如何執行此操作的示例,請參閱文檔中的使用 mxArrays

錯誤消息的第二部分是維度。 如果沒有看到函數的代碼、Simulink 模型以及函數的輸入/輸出是如何定義的,就很難判斷發生了什么,但您需要確保在端口和端口中定義了正確的大小和數據類型。 數據管理器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM