C和MATLAB:为什么MATLAB中的一行成为MATLAB编码器生成的C 代码中的许多行

C and Matlab: Why does this one line in Matlab become so many lines in C++ code generated by Matlab Coder?

本文关键字:MATLAB 许多行 代码 编码器 一行 为什么      更新时间:2023-10-16

我有一些MATLAB代码,如以下问题所述:MATLAB:MATLAB:是否会从循环中反复调用相同的MEX函数?

我正在尝试将其进行MEX化,以查看是否有帮助。现在,当我使用MATLAB代码器工具从MATLAB代码生成代码时,代码通常是合理的,但是MATLAB代码(在下面的第一行中的C 注释中)会遇到这种怪兽,我不知道为什么。理解和降低其复杂性方面的任何帮助将不胜感激。

对于上下文,D是二维矩阵,而S1是行向量。S1_IDX在上述C 代码中分配为长度(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];
}

这是您实际想要完成的非常有趣的生成代码。您只想将整数0塞入数组中。但是代码生成器的构建是为了处理一般情况。因此,生成的代码有三个部分:

  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;
}

matlab是一种特殊情况,旨在使用特殊的数学功能。您确实意识到,在引擎盖下仍在翻译成许多处理器可以理解的机器代码。

有很多问题,所以问同样的事情:"为什么XX在MATLAB中如此容易做,而在C 中如此努力?"。因为MATLAB是为此设计的设计,而C 是一种通用语言。

MATLAB开发人员必须编写那些大型代码表,以为您提供仅使用一行使用此功能的方法。C 在标准库中没有它,因此您需要自己制作。

好吧,举一个简单的例子。假设用户A和B想要解决二次等式。用户A使用数学软件包,他要做的就是写

在2x 2 6x 3 = 0

中找到x
另一方面,

用户B正在使用C ,他必须 Write 一个函数来计算判别剂,计算值(他也必须担心负面歧视性)并输出它们,数学软件包的开发人员已经为用户A所做的事情。这确实是很多代码,这是我迅速搜索过的示例。

现在想象一下用户说:"嘿,B,为什么您需要写这么多代码?我只能在1行中做!"这将是您的情况;)

也不要忘记,如果您谈论人类的可读性和易用性,自动生成的代码并不总是有史以来最好的代码。

我参加了这个聚会,但是现有的答案集中在为什么发生的原因上,不讨论您能做什么。

如果您知道哪种行会导致奇怪,杂乱的C代码,则应尝试更改该行。而不是:

d(:, 1) = 0:length(s1);

要尝试的一件事是删除对变量s1的依赖性:

d(:, 1) = 0:size(d,1);

另一个选择是编写一个简单的循环,该循环几乎可以直接翻译成C。

for i = 0:size(d,1)
    d(i,1) = i;
end