1

私は他の多くの人が以前に抱えていた問題を抱えているので、次の質問をする前にいくつかの議論と参考文献を読みました:

Simulink に Matlab 関数ブロックがあり、これを変調器にしたいと考えています。入力としてデータのフレームを取得し、フレームを[nx1]返す必要があり[lx1]ます。l=nl = n/KKn

ただし、(非常に単純化された)コードの抜粋

function ak = Modulator(dataFrame,dataType)

      coder.varsize('ak',length(dataFrame));

      M = 4; % this is for simplicity in this extract

      if dataType == 1 %input is a binary stream, bit mapping required
              ak = zeros(round(length(dataFrame)/log2(M)),1);
      else % input data is a stream of integer
              ak = zeros(length(dataFrame),1);
      end  

  end

コンパイルされないため

"Data 'ak' is inferred as a variable size matrix,
 while its specified type is something else."

ここでline 2、可変サイズの行列であることを指定し、if/elseコンストラクタを使用して初期化しました。

コンパイラを満足させるために、Data and Ports Manager での"Variable number of columns"チェックボックスをオンにすることができますが、これは新しいエラーになります。akフィルター。

4

2 に答える 2

1

まず、データを可変サイズにするかどうかを確認する必要があります。サンプル コードに基づいて、dataType に基づいてサイズを変更したいようです。dataType はコンパイル時の (実行時ではない) 変数のように感じます。この場合は、これを MATLAB Function ブロックのパラメーターにして、調整できないようにする必要があります。その後、set_param 関数を使用してこのパラメーターの値を設定できます。これを行うと、dataType の値はコンパイル時に認識され、固定サイズの「ak」になる「if」分岐の 1 つだけが分析されます。

そうではなく、実行時に dataType を切り替えたい場合は、データおよびポート マネージャーで [可変サイズ] オプションをオンにする必要があります。この場合、ak は可変サイズのデータ​​です。この出力は、可変サイズの入力をサポートできる他のブロックでのみ使用できます。

于 2013-06-17T18:14:50.443 に答える
1

上記のコードは、次の 2 つの問題によりコンパイルできませんでした。

  • ak の初期化は、dataType の値に依存します。これは入力ではなく、MATLAB 関数ブロックの上のマスクで定義されたパラメーターです。ただし、実行時に if/else の 2 つの分岐のいずれかが選択されるように、「調整可能」とマークされていました。これにより、実行時に ak が可変サイズの配列になり、エラーが発生しました。

  • 2 番目のエラーを理解するには、私が提供したサンプル コードのより完全なバージョンを検討してください。

    function ak = Modulator(dataFrame,modscheme,dataType)

    persistent constellation
    persistent M
    if isempty(constellation) || isempty(M)
        switch modcode
            case 1
                constellation = get_it_from_some_function;
                M = xx;
            case n
                ...
        end
    
    if dataType == 1 %input is a binary stream, bit mapping required
              ak = zeros(round(length(dataFrame)/log2(M)),1); % <- ERROR!!
    else % input data is a stream of integer
              ak = zeros(length(dataFrame),1);
    end      
    end
    

このコードはコンパイルされません。これは、コンパイラが認識すると、実行時に M が変更される可能性があり、したがって ak のサイズが変更される可能性があるためです。M は 1 回だけ割り当てられるため、実際にはこれは発生しませんが、コンパイラはそれを受け入れません。

于 2013-06-17T20:54:06.403 に答える