主要内容

coder.areUnboundedVariableSizedArraysSupported

检查当前配置设置是否允许无界可变大小数组

自 R2024a 起

说明

tf = coder.areUnboundedVariableSizedArraysSupported 返回逻辑值,该值指示在代码生成期间或 Simulink® 模型仿真期间是否支持无界可变大小数组。

  • 在从 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))。否则,它会实现算法来执行计算,而不会创建无界可变大小数组。

定义入口函数 sumrand,该函数接受标量输入 n 并返回 n 个随机数之和。

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 入口函数 sumrand 使用 emxArray 数据结构体来表示无界可变大小数组 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 入口函数 sumrand 不使用 emxArray 数据结构体,因此不使用可变大小数组。

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 中推出