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

2024-04-18 23:54:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图将这段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&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

Tags: 内存代码selffor数组assertnrint
3条回答

在您的翻译中,我首先要担心的是创建有意义的变量名,特别是那些数组的变量名。不管怎样,大部分都是直接翻译的。

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。。。所以小心行事。

Python部分的一个建议是使用numpy数组来表示矩阵(可能还有数组)。但老实说,你现在不应该关心这个问题。C代码看起来很难看。除此之外,不同的语言使用不同的方法来实现相同的事情。这就是使这种转变变得困难的原因。试着理解它实现的算法(假设这就是它所做的),并用一种与语言无关的方式写下来。然后考虑如何在Python中实现它。

NwtNdt是二维数组。这些行:

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

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

你没有显示dmat函数在做什么,所以很难分解它。

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

相关问题 更多 >