Matlab 到 C++ 的翻译

Posted

技术标签:

【中文标题】Matlab 到 C++ 的翻译【英文标题】:Matlab to C++ Translation 【发布时间】:2018-12-06 14:22:57 【问题描述】:

我最近开始了我的 C++ 之旅,除了基础知识外,我对它知之甚少。我正在尝试将我的 Matlab 代码翻译成 C++,以帮助我理解两者之间的差异。 Matlab 代码采用给定的输入 X(height),并计算输入的密度 (rho) 和声速 (acousticSpeed)。

这是 Matlab 代码。

function [rho, acousticSpeed] = atmos(X)

     %only valid to X = 11Km
       %Constants
       gamma=1.4; 
       R=287.05;
       g=9.81; 
       To=288.15;
       Po=101325;
       zo=50; 
       L=-0.0065;
       %Temperature Calculation

       T=To+(L*(X-zo));

       %Pressure Calculation

       P=Po*(T/To)^(-g/(L*R));

       %Density Calculation

        rho=P/(R*T);

        %Acoustic Speed

        acousticSpeed=sqrt(gamma*R*T)



         end

根据我对 C++ 的了解,函数不能返回多个值(或者至少,这是一个非常密集的过程)。这个 Matlab 函数返回两个值,rho 和声学速度。目前,我在 C++ 上将其拆分为 2 个函数,以使用相关方程计算每个单独的输出。

对于 Rho 我有

rho(double x)
double zo;
double To;
double Po;
double L;
double g;
double R;
double p;
zo = 50;
To = 288.15;
Po = 101325;
L = -0.0065;
g = -9.81;
R = 287.05;
double T = To + L*(x-zo);
double P = pow((Po*(T/To)), -(g*(L*R)));
p = P/(R*T);
return p; 

对于音速我有

soundspeed(double x)
double zo;
double To;
double L;
double R;
double as;
double gamma;
zo = 0;
To = 288.15;
L = -0.0065;
R = 287.05;
gamma = 1.4;
double T = To + L*(x-zo);
as = pow(gamma*R*T,0.5);
return as;

我的主要功能是

int main()

cout << "Please enter a desired altitude in meters." << endl;
double x;
double A;
double B;
cin>> x;
A = soundspeed(x);
B = rho(x);
cout << "For Altitude: " << x << "  meters" << endl;
cout << "Speed of Sound:  " << A << " meters per second." << " Air Density: 
" << B;

return 0;

对于 500 米的输入,声速为每秒 338 米,密度约为 1.225。 声速函数返回正确值,但密度函数返回0。

我已经包含了 iostream 和 math.h(用于 pow() 函数)。

我做错了什么?有没有更简洁的方法可以将此 Matlab 函数转换为 C++?作为初学者,您有经验的人可以给我任何其他提示吗?谢谢。 抱歉,我不确定如何包含所有信息。

【问题讨论】:

第一件事是您将变量声明为旧式 C。在需要的范围内声明变量。 函数只能返回一个值,尽管声明一个包含多个值的结构是最简单的,例如struct two_values int value1; int value2;;,你可以毫不费力地返回 不是问题:pow 似乎是计算幂的通用函数,尽管在某些情况下pow 不是最好的(例如,对于整数)。也许pow 会做同样的事情,但对于平方根,我还是宁愿使用std::sqrt。 @MatthieuBrucher 是的it was the case in C89。作为一个奇怪的好奇心,我发现了this,它有一个关于在 c 中声明变量的提示,我不敢在这里引用;) 您可以通过为所有参数定义struct、设置它们的值并将其用作函数的输入变量来避免此类问题 【参考方案1】:

问题在于括号和值的位置,特别是在压力计算中。 原来是

double P = pow((Po*(T/To)), -(g*(L*R)));

但是正确的方程式是

double P = Po*pow((T/To), -(g/(L*R)));

一个简单的解决方案,我应该在发布之前尝试过,因为我不想浪费任何人的时间。

感谢大家的帮助!

【讨论】:

以上是关于Matlab 到 C++ 的翻译的主要内容,如果未能解决你的问题,请参考以下文章

openCV中的Matlab convn

MATLAB 到 C++:MATLAB Coder 不支持 csvread()

将 C++ MEX 文件中的值返回到 MATLAB

在 matlab 到 C++ 的转换中未正确设置二维数组

Debian系统中如何将matlab编译后的代码集成到c++中

强制 c++ 程序使用 dos() 将“同步”输出显示到 MATLAB 命令窗口