Main Content

coder.areUnboundedVariableSizedArraysSupported

現在のコンフィグレーション設定で非有界の可変サイズ配列が許可されているかどうかを確認する

R2024a 以降

説明

tf = coder.areUnboundedVariableSizedArraysSupported は、コード生成中または Simulink® モデル シミュレーション中に非有界の可変サイズ配列がサポートされているかどうかを示す logical 値を返します。

  • MATLAB® コードからのコード生成中に、この関数はコード コンフィギュレーション設定 [動的メモリ割り当てを有効化] (EnableDynamicMemoryAllocation) および [可変サイズを有効化] (EnableVariableSizing) の状態をチェックします。両方の設定が有効になっている場合、関数は true を返します。それ以外の場合、関数は false を返します。

  • Simulink モデル シミュレーション中に、この関数はコンフィギュレーション パラメーター [MATLAB 関数での動的メモリ割り当て] (MATLABDynamicMemAlloc) の状態を返します。

  • Simulink モデルからのコード生成中に、この関数はコンフィギュレーション パラメーター [MATLAB 関数での動的メモリ割り当て] (MATLABDynamicMemAlloc) および [サポート: 可変サイズの信号] (SupportVariableSizeSignals) の状態をチェックします。これらのパラメーターが両方とも有効になっている場合、関数は true を返します。それ以外の場合は false を返します。

  • MATLAB の実行時、この関数は常に true を返します。

すべて折りたたむ

スカラー入力 n を受け入れ、n 個の乱数の合計を返す MATLAB 関数 sumrand のコードを生成します。非有界の可変サイズ配列がサポートされている場合、sumrand は単に sum(rand(1,n)) を呼び出します。それ以外の場合は、非有界の可変サイズ配列を作成せずに計算を実行するアルゴリズムを実装します。

スカラー入力 n を受け入れ、n 個の乱数の合計を返すエントリポイント関数 sumrand を定義します。

function s = sumrand(n)
% Return the sum of n random numbers.
if coder.areUnboundedVariableSizedArraysSupported
    s = sum(rand(1,n));
else
    s = 0;
    blockSize = 128;
    nBlocks = floor(n/blockSize);
    % Add in the complete blocks.
    for k = 1:nBlocks
        s = s + sum(rand(1,blockSize));
    end
    % Process any partial block remaining.
    s = s + sum(rand(1,rem(n,blockSize)));
end

既定のコンフィグレーション設定を使用してコードを生成します。既定では、非有界の可変サイズ配列はサポートされています。したがって、コード ジェネレーターは、関数 sumrand 内の if 分岐のコードを生成します。

codegen -config:lib -c sumrand -args 0 -d codegen_unbounded -report
Code generation successful: View report

レポートを開き、生成されたコードを検査します。生成された C エントリポイント関数 sumrandemxArray データ構造を使用して、非有界の可変サイズ配列 x を表します。

double sumrand(double n)
{
  emxArray_real_T *x;
  double s;
  double *x_data;
  int ib;
  int k;
  if (!isInitialized_sumrand) {
    sumrand_initialize();
  }
  emxInit_real_T(&x);
  b_rand(n, x);
  x_data = x->data;
  if (x->size[1] == 0) {
    s = 0.0;
  } else {
    int firstBlockLength;
    int lastBlockLength;
    int nblocks;
    if (x->size[1] <= 1024) {
      firstBlockLength = x->size[1];
      lastBlockLength = 0;
      nblocks = 1;
    } else {
      firstBlockLength = 1024;
      nblocks = (int)((unsigned int)x->size[1] >> 10);
      lastBlockLength = x->size[1] - (nblocks << 10);
      if (lastBlockLength > 0) {
        nblocks++;
      } else {
        lastBlockLength = 1024;
      }
    }
    s = x_data[0];
    for (k = 2; k <= firstBlockLength; k++) {
      s += x_data[k - 1];
    }
    for (ib = 2; ib <= nblocks; ib++) {
      double bsum;
      int hi;
      firstBlockLength = (ib - 1) << 10;
      bsum = x_data[firstBlockLength];
      if (ib == nblocks) {
        hi = lastBlockLength;
      } else {
        hi = 1024;
      }
      for (k = 2; k <= hi; k++) {
        bsum += x_data[(firstBlockLength + k) - 1];
      }
      s += bsum;
    }
  }
  emxFree_real_T(&x);
  return s;
}

動的メモリ割り当てを無効にしてコードを生成します。変更後のコンフィグレーション設定では、非有界の可変サイズ配列はサポートされません。したがって、コード ジェネレーターは、関数 sumrand 内の else 分岐のコードを生成します。

cfg = coder.config('lib');
cfg.EnableDynamicMemoryAllocation = false;
codegen -config cfg -c sumrand -args 0 -d codegen_bounded -report

レポートを開きます。生成された C エントリポイント関数 sumrandemxArray データ構造を使用しないため、可変サイズの配列を使用しないことに注意してください。

double sumrand(double n)
{
  double x[128];
  double s;
  double y;
  int x_size[2];
  int b_k;
  int k;
  int vlen;
  if (!isInitialized_sumrand) {
    sumrand_initialize();
  }
  s = 0.0;
  /*  Add in the complete blocks. */
  vlen = (int)floor(n / 128.0);
  for (k = 0; k < vlen; k++) {
    b_rand(x);
    y = x[0];
    for (b_k = 0; b_k < 127; b_k++) {
      y += x[b_k + 1];
    }
    s += y;
  }
  /*  Process any partial block remaining. */
  c_rand(rt_remd_snf(n, 128.0), x, x_size);
  vlen = x_size[1];
  if (x_size[1] == 0) {
    y = 0.0;
  } else {
    y = x[0];
    for (k = 2; k <= vlen; k++) {
      y += x[k - 1];
    }
  }
  s += y;
  return s;
}

バージョン履歴

R2024a で導入