gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:33:23 25 4
gpt4 key购买 nike

我有一些运行了数百万次的 Matlab 代码,如以下问题所述:Matlab: Does calling the same mex function repeatedly from a loop incur too much overhead?

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

对于context,d是一个二维矩阵,s1是一个行 vector 。 s1_idx 在前面的 C++ 代码中被指定为 length(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 到 k 填充到一个数组中。但是代码生成器是为处理一般情况而构建的。所以生成的代码分为三部分:

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

最后,您可能只需要:

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

关于c++ - C 和 Matlab : Why does this one line in Matlab become so many lines in C++ code generated by Matlab Coder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12954334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com