[英]size allocation in simulink
通常在simulink中,編寫“ Matlab fcn”時需要預先分配大小。 在函數中,可以使用聲明
coder.varsize('var',[n, m]);
其中n和m給出最大可能的大小。 我遇到的問題與以下功能有關:
function y = fcn(u)
coder.varsize('tmp',[1, 100])
test = ((abs(diff(u)))*100 > 10);
i1 = find(test,1,'first');
i2 = find(test,1,'last');
while i2>=i1
i1 = max(1,i1-1);
i2 = i2+1;
tmp = u(i1:i2);
t1 = conv(tmp,[1 2 1]/4);
t2 = t1(2:end-1);
t2(1) = t2(1)+t1(1);
t2(end) = t2(end)+t1(end);
u(i1:i2) = t2;
test = ((abs(diff(u)))*100 > 10);
i1 = find(test,1,'first');
i2 = find(test,1,'last');
end
y = u;
end
由於tmp的大小取決於i1和i2的值。 通常,使用coder.varsize進行的聲明應該不是問題,但是這次我不知道如何實現這一點。
如果您需要更多信息,請與我們聯系!
編輯:如果我固定功能的輸出大小,我得到
Errors occurred during parsing of MATLAB function 'MATLAB Function'
如果我將函數的輸出大小設置為“繼承”,則會得到
Error in default port dimensions function of S-function 'MATLAB Function'. This function does not fully set the dimensions of output port 3
我懷疑發生了幾件事。
首先,代碼生成器不知道與find
一起使用的可選輸入會導致標量輸出。 (實際上,並不是因為輸出可能為空或標量。)要克服這種用法,請find
沒有任何可選輸入的情況下進行find
,然后在定義i1
和i2
時提取第一個和最后一個元素。
其次,您需要正確處理find
確實返回空輸出的情況。 我已經在下面的示例代碼中完成了此操作,但是您幾乎可以肯定需要對其進行修改,以適合實際模型中所需的特定邏輯。
function y = fcn(u)
coder.varsize('tmp',[1, 100]);
coder.varsize('find_idx',[1, 100]);
test = ((abs(diff(u)))*100 > 10);
find_idx = find(test);
if ~isempty(find_idx)
i1 = find_idx(1); % find(test,1,'first');
i2 = find_idx(end); %find(test,1,'last');
while i2>=i1
i1 = max(1,i1-1);
i2 = i2+1;
tmp = u(i1:i2);
t1 = conv(tmp,[1 2 1]/4);
t2 = t1(2:end-1);
t2(1) = t2(1)+t1(1);
t2(end) = t2(end)+t1(end);
u(i1:i2) = t2;
test = ((abs(diff(u)))*100 > 10);
find_idx = find(test);
if ~isempty(find_idx)
i1 = find_idx(1); % find(test,1,'first');
i2 = find_idx(end); %find(test,1,'last');
else
break
end
end
y = u;
else
y = u;
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.