Скопировать выделенные строки в новую матрицу
Я хочу скопировать строки 0, 2 и 4 моей матрицы A в 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;
}
Ответы
Ответ 1
Я нашел push_back
.
Создайте B
с помощью size 0 x vec_length
, а затем используйте push_back
, чтобы добавить выбранные строки из A
:
#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);
cv::Mat B = cv::Mat(0,vec_length, CV_32FC1);
B.push_back(A.row(0));
B.push_back(A.row(2));
B.push_back(A.row(4));
std::cout << "A: " << A << std::endl;
std::cout << "B: " << B << std::endl;
return 0;
}
Ответ 2
Путь в OpenCV 2.4.1:
A.row(0).copyTo(B.row(0));
A.row(2).copyTo(B.row(1));
A.row(4).copyTo(B.row(2));
Ответ 3
Так как они несмежные, я не думаю, что есть ярлык. В этом конкретном случае вы можете сделать очиститель кода с помощью цикла:
for (int i=0; i<3; i++) {
cv::Mat tmp = B(cv::Rect(0,i,vec_length,1));
A.row(i * 2).copyTo(tmp);
}
Ответ 4
Mat row = old.row(0);
old.row(0).copyTo(row);
new.push_back(row);