C和Matlab:为什么Matlab中的这一行在Matlab Coder生成的C++代码中变得如此之多?

sun*_*ica 7 c c++ matlab code-generation

我有一些运行数百万次的Matlab代码,如本问题所述:Matlab:从循环中重复调用相同的mex函数会产生太多的开销吗?

我正在尝试mex-ify,看看是否有帮助.现在,当我使用Matlab Coder工具从Matlab代码生成代码时,代码通常是合理的,但是这一行Matlab代码(在下面第一行的C++注释中)会产生这种怪异,我不知道为什么.任何帮助理解和降低其复杂性将不胜感激.

对于上下文,d是二维矩阵,s1是行向量.在前面的C++代码中,s1_idx被指定为长度(s1)+ 1,

/* d(:, 1) = 0:length(s1); */
cdiff = s1_idx_0 - 1;
for (nm1d2 = 0; nm1d2 <= cdiff; nm1d2++) {
   tmp_data[nm1d2] = nm1d2;
}
ndbl = (int32_T)muDoubleScalarFloor((real_T)s1_sizes[1] + 0.5);
apnd = ndbl;
cdiff = ndbl - s1_sizes[1];
if (muDoubleScalarAbs((real_T)cdiff) < 4.4408920985006262E-16 * (real_T)s1_sizes[1]) {
   ndbl++;
   apnd = s1_sizes[1];
} else if (cdiff > 0) {
   apnd = ndbl - 1;
} else {
   ndbl++;
}
if (ndbl > 0) {
   b_tmp_data[0] = 0.0;
   if (ndbl > 1) {
       b_tmp_data[ndbl - 1] = (real_T)apnd;
       nm1 = ndbl - 1;
       nm1d2 = nm1;
       nm1d2 = (int32_T)((uint32_T)nm1d2 >> 1);
       for (cdiff = 1; cdiff <= nm1d2 - 1; cdiff++) {
           b_tmp_data[cdiff] = (real_T)cdiff;
           b_tmp_data[(ndbl - cdiff) - 1] = (real_T)(apnd - cdiff);
       }
       if (nm1d2 << 1 == nm1) {
           b_tmp_data[nm1d2] = (real_T)apnd / 2.0;
       } else {
           b_tmp_data[nm1d2] = (real_T)nm1d2;
           b_tmp_data[nm1d2 + 1] = (real_T)(apnd - nm1d2);
       }
   }
}
cdiff = s1_idx_0 - 1;
for (nm1d2 = 0; nm1d2 <= cdiff; nm1d2++) {
   SD->f0.d_data[tmp_data[nm1d2]] = b_tmp_data[nm1d2];
}
Run Code Online (Sandbox Code Playgroud)

JCo*_*per 4

对于您真正想要完成的任务来说,这是非常有趣的生成代码。您只想将整数 0 到 k 填充到数组中。但代码生成器是为了处理一般情况而构建的。所以生成的代码分为三个部分:

  1. 创建一个索引数组,指定右侧元素在左侧的位置。你使用了这个:表达方式,但你也可以使用其他的东西。代码生成器必须为您做好类似d(length(s1):0, 1)=0:length(s1).
  2. 为右侧创建一个值数组。您只是执行顺序整数,但代码生成器已准备好处理双精度数,并且当从一系列双精度数创建值时,您可能会遇到有趣的舍入问题。它正在检查各种边缘情况。
  3. 最后,有一个循环,它实际上将右侧的值分配给左侧的内存槽,该内存槽由步骤 1 中创建的数组索引。

最后,您可能需要的只是:

cdiff = s1_idx_0 - 1;
for (nm1d2 = 0; nm1d2 <= cdiff; nm1d2++) {
   SD->f0.d_data[nm1d2] = nm1d2;
}
Run Code Online (Sandbox Code Playgroud)