簡體   English   中英

Simulink中的大小分配

[英]size allocation in simulink

通常在simulink中,編寫“ Matlab fcn”時需要預先分配大小。 在函數中,可以使用聲明

coder.varsize('var',[n, m]);

其中nm給出最大可能的大小。 我遇到的問題與以下功能有關:

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的大小取決於i1i2的值。 通常,使用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 ,然后在定義i1i2時提取第一個和最后一個元素。

其次,您需要正確處理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.

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