将C++代码翻译成Python的正确方法
Correct way to translate C++ code to Python
我有一个C++代码,用于执行以下操作:
U[0]=rate[0];
map<int,double> Q[N+1];
map<int,double> r[N+1];
map<int,double> d[N+1];
r[0][0]=rate[0];
d[0][0]=1/(1+r[0][0]*dt);
Q[0][0]=1.0;
for(int i=1;i<=N;i++)
{
for(int j=-i;j<=i;j=j+2)
{
if(j==i)
{Q[i][i]= 0.5*Q[i-1][i-1]*d[i-1][i-1];}
if(j==-i)
{Q[i][-i]=0.5*Q[i-1][-i+1]*d[i-1][-i+1];}
Q[i][j]=0.5*(Q[i-1][j-1]*d[i-1][j-1]+Q[i-1][j+1]*d[i-1][j+1]);
}
}
我需要为此编写等效的Python版本,因为我对C++不太熟悉。我做了以下工作:
Q, U, r, d = [], [], [], []
Q.append([])
Q[0].append(1)
U.append(rate[1])
r.append([])
r[0].append(rate[1])
d.append([])
d[0].append(1/(1+r[0][0]*dt))
for i in range(0, N):
for j in range(-i, i, 2):
if j == i:
Q[i].append(0.5*Q[i-1][i-1]*d[i-1][i-1])
elif j == -i:
Q[i].insert(-i, (0.5*Q[i-1][-i+1]*d[i-1][-i+1]))
Q[i].insert(j, 0.5*(Q[i-1][j-1]*d[i-1][j-1]+Q[i-1][j+1]*d[i-1][j+1]))
然而,我在这一行中得到了一个index out of range
错误:
Q[i].insert(-i, (0.5*Q[i-1][-i+1]*d[i-1][-i+1]))
如何正确地将C++代码翻译成与python等效的代码?
您会得到索引错误,因为您的数组没有像C++中那样预填充。
试着这样定义它们:
from collections import defaultdict
...
#map<int,double> Q[N+1];
Q = [defaultdict(float) for _ in range(N+1)]
#map<int,double> r[N+1];
r = [defaultdict(float) for _ in range(N+1)]
#map<int,double> d[N+1];
d = [defaultdict(float) for _ in range(N+1)]
如何正确地将C++代码翻译成与python等效的代码?
如果是我,而我不理解我开始使用的代码,我会用绝对最小的更改来逐行、逐个表达式地进行翻译。
我还需要一个用C++代码正确运行的测试用例,并对其进行调整以确认Python代码。
这是我的逐行翻译:
from collections import defaultdict
#NameError: name 'N' is not defined
N = 12
#NameError: name 'rate' is not defined
rate = [.03]
#NameError: name 'dt' is not defined
dt = 1.0/12
#U[0]=rate[0];
# unused
#map<int,double> Q[N+1];
Q = [defaultdict(float) for _ in range(N+1)]
#map<int,double> r[N+1];
r = [defaultdict(float) for _ in range(N+1)]
#map<int,double> d[N+1];
d = [defaultdict(float) for _ in range(N+1)]
#r[0][0]=rate[0];
r[0][0] = rate[0]
#d[0][0]=1/(1+r[0][0]*dt);
d[0][0] = 1 / (1 + r[0][0] * dt)
#Q[0][0]=1.0;
Q[0][0] = 1.0
#for(int i=1;i<=N;i++)
#{
for i in range(1, N+1, 1):
# for(int j=-i;j<=i;j=j+2)
# {
for j in range(-i, i+1, 2):
# if(j==i)
# {Q[i][i]= 0.5*Q[i-1][i-1]*d[i-1][i-1];}
if j == i:
Q[i][i] = 0.5 * Q[i-1][i-1] * d[i-1][i-1]
# if(j==-i)
# {Q[i][-i]=0.5*Q[i-1][-i+1]*d[i-1][-i+1];}
if j == -i:
Q[i][-i] = 0.5 * Q[i-1][-i+1] * d[i-1][-i+1]
# Q[i][j]=0.5*(Q[i-1][j-1]*d[i-1][j-1]+Q[i-1][j+1]*d[i-1][j+1]);
Q[i][j] = 0.5 * (Q[i-1][j-1] * d[i-1][j-1] + Q[i-1][j+1] * d[i-1][j+1])
# }
#}
相关文章:
- 如何通过python方法和kwargs来提升python的c++函数和调用
- 将FFMpeg AVFrame对象从C++应用程序流式传输到Python的最佳方法?
- 如何将 c++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 在 c++ 或 python 中生成一个体面的视差图以在 Raspberry Pi 上实现的最佳方法(算法或函数)是什么
- 无法将__str__特殊方法与Boost::Python接口
- 方法 argv[] SWIG C++ / Python 中的错误,会发生什么?
- 在C++和Python之间交换数据的最快方法是什么?
- Python的追加方法C++等价物是什么?
- 我如何在C++中使用某种方法来替换 python 中的 isdisjoint
- 如何使用Python脚本或其他一些方法来美化所有文件
- boost.python:如何获取super()方法
- 在 Python 中使用 C/C++ 的最快方法是什么?
- 在Python 3中替换Pysstring_fromstring方法
- 在OPENCV中,仅在C 中存在某些方法,如何在Python中做同一件事
- Python Numpy 方法对应于 C++ Eigen make crash
- 无法从 Python C API 中内置的模块调用方法
- 编写要在 Python 中使用的并行 C/C++ 模块的最简单方法
- 使用 pybind11 将自定义结构(指针向量)从 C++ 传递到 python 的方法是什么?
- 如何在 Python 中的 SWIG Director 方法中处理空指针
- boost-python 当C++方法返回 std::map<string,X*>