如何将此C代码转换为Python?
我正在尝试将我的C代码转换成python脚本,以便更多的人可以轻松地访问它,但是我在理解这段代码时遇到了问题如何将此C代码转换为Python?,python,c,Python,C,我正在尝试将我的C代码转换成python脚本,以便更多的人可以轻松地访问它,但是我在理解这段代码时遇到了问题 int i, t; for (i = 0; i < N; i++) { t = (int)(T*drand48()); z[i] = t; Nwt[w[i]][t]++; Ndt[d[i]][t]++; Nt[t]++; } Nwt和Ndt也是数组,每个元素都是内存分配?(不确定)。至少,它们中的每一个都是使用以下方法创建的,传入两个不同的int N
int i, t;
for (i = 0; i < N; i++) {
t = (int)(T*drand48());
z[i] = t;
Nwt[w[i]][t]++;
Ndt[d[i]][t]++;
Nt[t]++;
}
Nwt和Ndt也是数组,每个元素都是内存分配?(不确定)。至少,它们中的每一个都是使用以下方法创建的,传入两个不同的int
Nwt = dmat(W,T);
Ndt = dmat(D,T);
double **dmat(int nr, int nc) //
{
int N = nr*nc;
double *tmp = (double*) calloc(N,sizeof(double));
double **x = (double**)calloc(nr,sizeof(double*));
int r;
assert(tmp);
assert(x);
for (r = 0; r < nr; r++) x[r] = tmp + nc*r;
return x;
}
这就是我到目前为止所做的:
for i in range(self.N):
t = self.T * random.random()
self.z[i] = t
//** INCORRECT BELOW **
//self.Nwt[self.N[i]] = t + 1
//self.Ndt[i] = t + 1
//self.Nt[t + 1] += 1
Python部分的一个建议是使用数组来表示矩阵(也可能是数组)。但是说实话,你现在不应该担心这个。那个C代码看起来很难看。除此之外,不同的语言使用不同的方法来实现相同的目标。这就是为什么这种转换很困难的原因。试着理解它实现的算法(假设它就是这样做的),并以一种语言不可知的方式写下来。然后想想你将如何在Python中实现它。对于Python部分的建议是使用数组来表示矩阵(也可能是数组)。但是说实话,你现在不应该担心这个。那个C代码看起来很难看。除此之外,不同的语言使用不同的方法来实现相同的目标。这就是为什么这种转换很困难的原因。试着理解它实现的算法(假设它就是这样做的),并以一种语言不可知的方式写下来。然后想想你将如何在Python中实现它。
Nwt
和Ndt
是二维数组。这些线路:
Nwt[w[i]][t]++;
Ndt[d[i]][t]++;
将每个数组中某个位置的值递增1。如果将寻址视为数组[列][行]
,则该列将根据索引i的其他一维数组w
和d
中的值进行选择t
似乎是一些随机索引
您没有显示dmat的函数在做什么,很难将其分解
(在Python方面无法帮助您,希望这有助于澄清C)Nwt
和Ndt
是二维数组。这些线路:
Nwt[w[i]][t]++;
Ndt[d[i]][t]++;
将每个数组中某个位置的值递增1。如果将寻址视为数组[列][行]
,则该列将根据索引i的其他一维数组w
和d
中的值进行选择t
似乎是一些随机索引
您没有显示dmat的函数在做什么,很难将其分解
(在Python方面无法帮助您,希望这有助于澄清C)好的,您似乎有一些想法是错误的。
N是数组的大小
dmat返回一个类似于矩阵的东西,它由nr行表示,其中每一行都是nc double的“数组”
ivec返回n个整数元素的“数组”
所以w[]和d[]表示双精度数组的索引
您遇到问题的循环用于增加矩阵的某些元素。一个索引显示为预先存储在w和d数组中,另一个是随机生成的,我怀疑,如果不知道代码的意图是什么,那么理解语义就有点困难
具体而言,了解以下信息可能会有所帮助:
Nwt[x][y]++表示增加(加1)第x列和第y列的矩阵元素
还必须提到的是,这个C代码很难看——没有有用的命名和注释,无所畏惧地使用C最糟糕的语法,真的很难理解。好吧,你似乎有一些想法是错误的。
N是数组的大小
dmat返回一个类似于矩阵的东西,它由nr行表示,其中每一行都是nc double的“数组”
ivec返回n个整数元素的“数组”
所以w[]和d[]表示双精度数组的索引
您遇到问题的循环用于增加矩阵的某些元素。一个索引显示为预先存储在w和d数组中,另一个是随机生成的,我怀疑,如果不知道代码的意图是什么,那么理解语义就有点困难
具体而言,了解以下信息可能会有所帮助:
Nwt[x][y]++表示增加(加1)第x列和第y列的矩阵元素
还必须提到的是,这段C代码很难看——没有有用的命名和注释,无所畏惧地使用C最糟糕的语法,真的很难理解。在您的翻译中,我首先要担心的是使用有意义的变量名,特别是对于那些数组。不管怎么说,大部分都是直接翻译的
Nwt和Ndt是二维阵列,Nt是一维阵列。看起来您正在z数组中的所有“列”上循环,并为每个列生成一个随机数。然后增加Nwt(第w[i]行)、Ndt(第d[i]行)和Nt中拾取的列。实际随机值隐藏在z中
#Literal translation
for i in range(N):
t = Random.randint(0,T) #Not sure on this... but it seems likely.
z[i] = t
Nwt[w[i]][t] += 1
Ndt[d[i]][t] += 1
Nt[t] += 1
#In place of w= ivec(N);
w = [0]*N
d = [0]*N
z = [0]*N
#In place of Nwt = dmat(W,T)
Nwt = [[0.0] * T] * W
Ndt = [[0.0] * T] * D
编辑:已将w/d/z初始化从“n”更正为“n”
注意这里仍然有一些错误,因为看起来N必须等于W,而D。。。因此,请小心处理。在您的翻译中,我首先要担心的是如何生成有意义的变量名,尤其是那些数组。不管怎么说,大部分都是直接翻译的
Nwt和Ndt是二维阵列,Nt是一维阵列。看起来您正在z数组中的所有“列”上循环,并为每个列生成一个随机数。然后增加Nwt(第w[i]行)、Ndt(第d[i]行)和Nt中拾取的列。实际随机值隐藏在z中
#Literal translation
for i in range(N):
t = Random.randint(0,T) #Not sure on this... but it seems likely.
z[i] = t
Nwt[w[i]][t] += 1
Ndt[d[i]][t] += 1
Nt[t] += 1
#In place of w= ivec(N);
w = [0]*N
d = [0]*N
z = [0]*N
#In place of Nwt = dmat(W,T)
Nwt = [[0.0] * T] * W
Ndt = [[0.0] * T] * D
编辑:已将w/d/z初始化从“n”更正为“n”
注意这里仍然有一些错误,因为看起来N必须等于W,而D。。。所以请小心处理。dmat函数位于我在原始代码中发布的第三个代码段中。这也是一个分配程序。我想这就是让我讨厌的原因。我不知道C,也不知道