簡體   English   中英

如何將C代碼轉換成Python?

[英]How do I convert this C code into 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

Python方面的建議是使用numpy數組來表示矩陣(也可能是數組)。 但老實說,您現在不應該擔心這一點。 那個C代碼看起來很難看。 除此之外,不同的語言使用不同的方法來實現同一件事。 這就是使這種轉換變得困難的原因。 嘗試了解它所實現的算法(假設就是它所做的),並以與語言無關的方式將其寫下來。 然后考慮如何在Python中實現它。

NwtNdt二維數組。 這些行:

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

將每個數組中一個位置的值加1。 如果將地址視為array[column][row] ,則根據索引i的其他一維數組wd的值分別選擇列。 t似乎是一些隨機索引。

您沒有顯示dmat函數的功能,因此很難分解其中的一個。

(無法在Python方面為您提供幫助,希望這有助於弄清C語言)

好的,您似乎有一些錯誤的主意。 N是數組的大小。

dmat返回一個由nr行表示的類似矩陣的矩陣-其中每一行都是nc double的“數組”

ivec返回n個整數元素的“數組”。

因此w []和d []代表雙精度數組的索引。

您遇到問題的循環用於增加矩陣的某些元素。 一個索引顯示為預存儲在w和d數組中,而另一個索引是隨機生成的,我懷疑-在不知道代碼的意圖的情況下,理解語義有點困難。

具體來說,可能會有助於了解:Nwt [x] [y] ++表示在行x col y處增加(加1)矩陣元素

還必須提及的是,此C代碼很丑陋-沒有有用的命名和注釋,無畏地使用C的最討厭的語法,確實很難遵循。

在您的翻譯中,我首先要擔心的是創建有意義的變量名,尤其是對於那些數組。 無論如何,其中大部分直接翻譯。

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 ...則應謹慎行事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM