0

そのため、ポインターを介して行列要素にアクセスしようとしています。これが私のコードです:

    CvMat *Q = cvCreateMat(3,3, CV_32F);
    for(int i = 0; i < Q->rows ; i++){
    float *ptr = (float *)(Q->data.ptr + i * Q->step );
    for(int j = 0; j < Q->cols ; j++){
        *ptr = 0.0;
        if((i ==0)&&(j==0)) *ptr = 1;
        if((i ==0)&&(j==1)) *ptr = 2;
        if((i ==0)&&(j==2)) *ptr = 3;
        if((i ==1)&&(j==0)) *ptr = 4;
        if((i ==1)&&(j==1)) *ptr = 5;
        if((i ==1)&&(j==2)) *ptr = 6;
        if((i ==2)&&(j==0)) *ptr = 7;
        if((i ==2)&&(j==1)) *ptr = 8;
        if((i ==2)&&(j==2)) *ptr = 9;
        //cout << *ptr << endl;
        //system("pause");
    }
}
cout << CV_MAT_ELEM(*Q,float,0,0) << endl;
cout << CV_MAT_ELEM(*Q,float,0,1) << endl;
cout << CV_MAT_ELEM(*Q,float,0,2) << endl;
cout << CV_MAT_ELEM(*Q,float,1,0) << endl;
cout << CV_MAT_ELEM(*Q,float,1,1) << endl;
cout << CV_MAT_ELEM(*Q,float,1,2) << endl;
cout << CV_MAT_ELEM(*Q,float,2,0) << endl;
cout << CV_MAT_ELEM(*Q,float,2,1) << endl;
cout << CV_MAT_ELEM(*Q,float,2,2) << endl;
system("pause");

forループで行列を次のように作成しようとしています:

[1 2 3

4 5 6

7 8 9]、

しかし、それらを計算すると、次のようになります。

3

-4.31602e+008

-4.31602e+008

6

-4.31602e+008

-4.31602e+008

9

-4.31602e+008

-4.31602e+008

-4.31602e+008 はどこから来たのですか? ここで何が理解できませんか?私はポインターに少し慣れていません。

4

2 に答える 2

2

CvMatの API を確認してください(c++ を使用できる場合は、Mat の使用を検討することもできます)。

ここで何を達成しようとしているのか完全にはわかりませんが、ポインターを使用してデータにアクセスしたい場合は、この時点で少し間違っています。

float *ptr = (float *)(Q->data.ptr + i * Q->step );

ここでのステ​​ップは、行内のバイト数です (したがって、ここでは 12、要素あたり 4 バイト * 3 要素になります) ポインターは、算術演算を行うときに、ポインターのデータ型に基づいて正しいバイト数を自動的にステップします。 (良いチュートリアルはこちら)。配列のようにアクセスするには、次のようにする必要があります。

CvMat *Q = cvCreateMat(3,3, CV_32F);
for(int i = 0; i < Q->rows ; i++){
  for(int j = 0; j < Q->cols ; j++){
    float *ptr = (float *)(Q->data.ptr) + i*Q->rows + j; //Index is row major
    if((i ==0)&&(j==0)) *ptr = 1;
    if((i ==0)&&(j==1)) *ptr = 2;
    if((i ==0)&&(j==2)) *ptr = 3;
    if((i ==1)&&(j==0)) *ptr = 4;
    if((i ==1)&&(j==1)) *ptr = 5;
    if((i ==1)&&(j==2)) *ptr = 6;
    if((i ==2)&&(j==0)) *ptr = 7;
    if((i ==2)&&(j==1)) *ptr = 8;
    if((i ==2)&&(j==2)) *ptr = 9;
   }
}

はるかに簡単な解決策は、存在する CV_MAT_ELEM マクロを使用することです。

CvMat *Q = cvCreateMat(3,3, CV_32F);
for(int i = 0; i < Q->rows ; i++){
  for(int j = 0; j < Q->cols ; j++){
    CV_MAT_ELEM(*Q, float, i, j) = i*Q->rows + j + 1;
   }
}
于 2013-11-13T04:47:01.597 に答える
0

ptr内側のjループ内でインクリメントする必要があります。

于 2013-11-13T04:17:31.967 に答える