【发布时间】:2020-11-19 18:31:27
【问题描述】:
我有一个数值算法。我为 R^2 中的点创建了一组 x 和 y 坐标。然后,我使用一个规则来查看哪些点适合我的目的,一个简单的 if 语句如下所示:
int N = 0;
for (int i1 = -xN; i1 < xN + 1; i1++)
{
for (int i2 = -yN; i2 < yN + 1; i2++)
{
double x = dist(0) * i1;
double y = dist(1) *i2;
if (sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x) < 3.1 && abs(y) < 3.91)
{
Points.row(N) = trans(vec{ x, y});
N = N + 1;
}
}
}
由于我在每个示例中更改了规则(即 sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x)
ofstream myfile;
myfile.open("resultEXAMPLE2D01.txt");
myfile << "xN = [" << xN << "];" << endl;
myfile << "N = [" << output.N << "];" << endl;
myfile << "% Condition is " << cond << endl;
myfile.close();
在这种情况下,“cond”应该是“sqrt(pow(x, 2) + pow(y, 2)) > 0.8 && abs(x)
【问题讨论】:
-
C++ 是一种编译语言,这意味着字符串“sqrt(pow(x,2)+[...]”实际上并不存在于编译的可执行文件中的任何位置(运行“字符串”实用程序上的可执行文件,如果你想验证);而是被编译成机器代码调用相关数学函数的地址。所以如果你想让你的程序将该字符串写入文件,你需要在您的程序中单独/明确地包含该字符串。
-
能否扭转物流局面? IE。与其尝试将编译后的条件存储到字符串中(这是不可能的,正如 Jeremy 上面解释的那样),为什么不将字符串存储在表示条件的程序中,然后添加一个解析器来在执行期间分析字符串?这当然会慢得多,也很难实现,但至少是可能的。
-
JeremyFriesner 感谢您的澄清。 @Yunnosch 它也会帮助我。所以我首先将条件定义为一个字符串,然后尝试将其更改为一个布尔变量,该变量可以针对每个 x 和 y 进行评估。你能解释一下吗?
-
不能针对不同的 x,y 计算布尔变量。您需要一个解析器将字符串“理解”为逻辑表达式。解析器是要实现的复杂事物。太复杂了,这里就不解释了。您可能需要阅读一些内容并寻找教程。可能StackOverflow对基本原理有一些疑问,或者在实现的时候具体问题。核心的变量是字符串。
-
我只是想到了一个替代方案。您可以决定以一种中间格式存储逻辑表达式,这种格式易于处理逻辑并易于转换为字符串表示形式以供输出。根据您对可能用例的了解,这可能是最好的方法。需要支持多少和哪些操作符,sqrt、pow、
<、>、&&、abs、....还有什么?如果您可以枚举它们,那么您就更接近于一个简单的解决方案。这样就不再需要一个完整的解析器了。