web-dev-qa-db-ja.com

選択した行を新しいマトリックスにコピーします

行列Aの行0、2、4をこの順序でBにコピーしたいと思います。 A = [a0、a1、a2、a3、a4] ^ Tとし、a_iを行ベクトルとすると、Bは[a0、a2、a4] ^ Tになります。

以下のコードは私が望むことをしますが、より良い解決策があるかどうか疑問に思います(おそらくEigenを使用しています)?

#include <iostream>
#include <vector>
#include <opencv/cv.h>


int main(int argc, char **argv) {
    const int num_points = 5;
    const int vec_length = 3;
    cv::Mat A(num_points, vec_length, CV_32FC1);
    cv::RNG rng(0); // Fill A with random values
    rng.fill(A, cv::RNG::UNIFORM, 0, 1);
// HACK Ugly way to fill that matrix .
    cv::Mat B = cv::Mat(3,vec_length, CV_32FC1);
    cv::Mat tmp0 = B(cv::Rect(0,0,vec_length,1));
    cv::Mat tmp1 = B(cv::Rect(0,1,vec_length,1));
    cv::Mat tmp2 = B(cv::Rect(0,2,vec_length,1));
    A.row(0).copyTo(tmp0);
    A.row(2).copyTo(tmp1);
    A.row(4).copyTo(tmp2);

    std::cout << "A: " << A << std::endl;
    std::cout << "B: " << B << std::endl;
    return 0;
}
14
Unapiedra

OpenCV2.4.1での方法は次のとおりです。

A.row(0).copyTo(B.row(0));
A.row(2).copyTo(B.row(1));
A.row(4).copyTo(B.row(2));
24
lxts

それらは連続していないので、近道はないと思います。この特定のケースでは、ループを使用してコードをよりクリーンにすることができます。

for (int i=0; i<3; i++) {
    cv::Mat tmp = B(cv::Rect(0,i,vec_length,1));
    A.row(i * 2).copyTo(tmp);
}
1
SSteve
Mat row = old.row(0);
old.row(0).copyTo(row);
new.Push_back(row);
0
guardezi