Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将此C代码转换为Python?_Python_C - Fatal编程技术网

如何将此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

我正在尝试将我的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

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,也不知道