0

我正在尝试找出a[++j]=*pr++;Python 中以下代码(来自 MatLab mex 文件)中的等效项。我发现'pr'是一个指向输入数组第一个元素的指针,但我无法理解 j 发生了什么。有人可以在没有指针等的情况下用简单的术语解释那里发生的事情吗?

rf3(mxArray *array_ext, mxArray *hs[]) {
double *pr, *po, a[16384], ampl, mean;
int tot_num, index, j, cNr;
mxArray *array_out;

tot_num = mxGetM(array_ext) * mxGetN(array_ext);
pr = (double *)mxGetPr(array_ext);

array_out = mxCreateDoubleMatrix(3, tot_num-1, mxREAL);
po = (double *)mxGetPr(array_out);

j = -1;
cNr = 1;
for (index=0; index<tot_num; index++) {
    a[++j]=*pr++;
    while ( (j >= 2) && (fabs(a[j-1]-a[j-2]) <= fabs(a[j]-a[j-1])) ) {
        ampl=fabs( (a[j-1]-a[j-2])/2 );
        switch(j)
{
            case 0: { break; }
            case 1: { break; }
            case 2: {
                mean=(a[0]+a[1])/2;
                a[0]=a[1];
                a[1]=a[2];
                j=1;
                if (ampl > 0) {
                    *po++=ampl;
                    *po++=mean;
                    *po++=0.50;
                }
                break;
            }
            default: {
                mean=(a[j-1]+a[j-2])/2;
                a[j-2]=a[j];
                j=j-2;
                if (ampl > 0) {
                    *po++=ampl;
                    *po++=mean;
                    *po++=1.00;
                    cNr++;
                }
                break;
            }
        }
    }
}
for (index=0; index<j; index++) {
    ampl=fabs(a[index]-a[index+1])/2;
    mean=(a[index]+a[index+1])/2;
    if (ampl > 0){
        *po++=ampl;
        *po++=mean;
        *po++=0.50;
    }
}
/* you can free the allocated memeory */
/* for array_out data                 */
  mxSetN(array_out, tot_num - cNr);
  hs[0]=array_out;
}
4

3 回答 3

5

这是发生的事情:

  1. 增加j1
  2. 分配给a[j]指向的值pr
  3. 增量pr

按照这个顺序。

于 2013-11-01T13:52:17.263 回答
2

您特别询问:

a[++j]=*pr++;

j 在赋值之前递增。在 python 中,左侧将是:

a[j+1] 

然后你还需要在下次使用它之前增加 j :

j += 1

右侧只是访问当前位置,然后增加数组中的位置。在 python 中,您可能只对数组使用迭代器。

顺便说一句,您可能会发现很难对代码进行逐行“翻译”。我建议写下算法的步骤,然后在 python 中重新处理它,如果这是你需要的。

于 2013-11-01T13:57:51.680 回答
1

在 Python 中,没有指针,所以你如何翻译它取决于你决定如何表示pr. 如果您将指针视为 list 的副本,则pr = array_ext[:]突出显示的行将类似于

j = j + 1
a[j] = pr.pop(0)

为了提高效率(并且更接近于 C 代码正在执行的操作),您可以将pr其用作 list 的索引array_ext,从0. 然后,您突出显示的行执行以下操作:

j = j + 1
a[j] = array_ext[pr]
pr = pr + 1
于 2013-11-01T13:58:09.380 回答