[英]Using Shell Escape (!) in Simulink Model (MATLAB Function)
[英]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.