我如何把这个C代码转换成Python?

r1zk6ea1  于 2023-01-25  发布在  Python
关注(0)|答案(4)|浏览(150)

我试图把我的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是一个值(数组中一列的和。Elemental更正了我)。
T只是一个数值。
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和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
whitzsjs

whitzsjs1#

对Python部分的建议是使用numpy数组来表示矩阵(可能还有数组)。但是老实说,你现在不应该关心这个。那个C代码看起来很难看。除此之外,不同的语言使用不同的方法来实现相同的事情。2这就是为什么这样的转换很困难。3试着理解它实现的算法(假设这就是它的作用),并以一种语言不可知的方式写下来,然后想想如何在Python中实现它。

0g0grzrc

0g0grzrc2#

在你的翻译中,我首先要担心的是变量名的合理性,尤其是数组的变量名。不管怎样,很多变量名都是直接翻译的。
Nwt和Ndt是2D数组,Nt是一维数组。看起来像是在z数组中的所有“列”上循环,并为每一列生成一个随机数。然后递增Nwt(row w[i])、Ndt(row 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......所以要小心处理。

jv4diomz

jv4diomz3#

NwtNdt二维数组。这些行:

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

将每个数组中某个位置的值加1,如果你认为地址是array[column][row],那么列是根据索引i的其他一维数组wd中的值来选择的,t看起来像是某个随机索引。
您没有显示dmat函数在做什么,因此很难分解它。
(Can在Python方面对您没有帮助,希望这有助于澄清C)

sqyvllje

sqyvllje4#

好吧,你似乎有一些想法是错误的,N是数组的大小。
dmat返回一个类似thing的矩阵,由nr行表示-其中每行是nc个双精度数的“数组
ivec返回n个整数元素的“数组”。
所以w[]和d[]表示双精度数组的索引。
你遇到麻烦的循环是用来增加矩阵的某些元素的,一个索引是预先存储在w和d数组中的,另一个是随机生成的,我怀疑--在不知道代码意图的情况下,理解语义有点困难。
具体而言,了解以下信息可能会有所帮助:Nwt[x][y]++表示递增(加1)第x行第y列的矩阵元素
还必须提到的是,这个C代码是丑陋的-没有有用的命名和没有注解,无所畏惧地使用C的最肮脏的语法,真的很难遵循。

相关问题