0

a[++j]=*pr++;次のコード (MatLab mex ファイルに由来する) に相当するものが Python にあるものを見つけようとしています。「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 では、おそらく配列にイテレータを使用するだけです。

ところで、コードを 1 行ずつ「翻訳」するのは難しいかもしれません。アルゴリズムの手順を書き留めてから、それが必要な場合は Python で新たに取り組むことをお勧めします。

于 2013-11-01T13:57:51.680 に答える
1

Python にはポインターがないため、これをどのように変換するかは、どのように表現するかによって異なりますpr。ポインターをリストのコピーと考えると、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 に答える