如何将此C代码转换为Python?

时间:2010-09-15 14:45:29

标签: 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]++;
}

N是一个值(数组中一列的总和。元素更正了我。)

T只是一个数值。

z,w和d是从N阵列创建的内存分配。它们是用这种方法创建的。

w = ivec(N);
d = ivec(N);
z = ivec(N);

int *ivec(int n) //
{
   int *x = (int*)calloc(n,sizeof(int));
   assert(x);
   return x;
}

Nwt&amp; 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;
}

所以看看我发布的第一个循环,以下几行是做什么的?我想在python中完成同样的事情,但是因为不需要内存分配,不确定这三行是做什么的,或者我将如何在python中复制它。

Nwt[w[i]][t]++;
Ndt[d[i]][t]++;
Nt[t]++;

这是我到目前为止所做的:

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

4 个答案:

答案 0 :(得分:2)

对Python部分内容的建议是使用numpy数组来表示矩阵(也可能是数组)。但说实话,你现在不应该关心它。那个C代码看起来很难看。除此之外,不同的语言使用不同的方法来实现相同的目标。这就是让这种转换变得困难的原因。尝试了解它实现的算法(假设它就是它所做的)并以与语言无关的方式写下来。然后想想如何在Python中实现它。

答案 1 :(得分:1)

NwtNdt 2维数组。这些行:

Nwt[w[i]][t]++;
Ndt[d[i]][t]++;

将每个数组中某个位置的值递增1。如果您将寻址视为array[column][row],则会根据索引i的某个其他一维数组wd中的值来选择列。 t似乎是一些随机索引。

你没有显示dmat函数正在做什么,所以很难打破它。

(在Python方面无法帮助你,希望这有助于澄清C)

答案 2 :(得分:1)

好吧,你好像有一些想法错了。 N是数组的大小。

dmat返回一个像nr行所表示的矩阵 - 其中每一行是nc双精度的'数组'

ivec返回n个整数元素的'数组'。

所以w []和d []表示双精度数组的索引。

您遇到问题的循环用于递增矩阵的某些元素。一个索引预先存储在w和d数组中,而另一个索引随机生成我怀疑 - 不知道代码的意图是什么,它有点难以理解语义。

具体而言,它可能有助于了解: Nwt [x] [y] ++表示在行x col y

处增加(加1)矩阵元素

还必须提一下,这个C代码是丑陋的 - 没有有用的命名和没有评论,无畏使用C的最恶劣的语法,真的很难遵循。

答案 3 :(得分:1)

在你的翻译中,我首先要担心的是制作灵敏的变量名,特别是那些数组。无论如何,其中很多都是直接翻译的。

Nwt和Ndt是2D阵列,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 ......所以请小心谨慎。