у меня
A
(матрица векторов с длиной = depth
) - 5x5 (5 строк и 5 столбцов).
depth
= 3 (это длина вектора любой ячейки матрицы A).
B
(матрица одиночных значений) - 75 x Any (5 * 5 * 3 строки и Any cols).
x_size_kernel
= 5.
block_idx
- индекс, здесь, например, мы сделали его равным 0 (только для одного столбца матрицы B)
Задача этого простого и строгого примера - скопировать все векторы матрицы A
в один (первый столбец) матрицы B
.
Теперь я решаю проблему следующим образом (это конкретный пример с точными данными)
Eigen::MatrixXf B;
B = Eigen::MatrixXf(x_size_kernel * y_size_kernel * depth, 100).setZero();
Eigen::Matrix<Eigen::VectorXf, Eigen::Dynamic, Eigen::Dynamic> A;
A.resize(5, 5);
auto depth = 3;
for (auto yy = 0; yy < A.rows(); yy++) {
for (auto xx = 0; xx < A.cols(); xx++) {
A(yy, xx).resize(depth);
}
}
auto block_idx = 0;
// and here are all copy for one column of matrix B
for (auto my = 0; my < x_size_kernel; my++) {
for (auto mx = 0; mx < x_size_kernel; mx++) {
// add the next column of block data
B.col(block_idx).
segment(mx * depth + my * x_size_kernel * depth, depth).noalias() =
A(my, mx);
}
}
Но приведенный выше код очень медленный, поэтому мне нужен более быстрый код. Может быть, кто-то знает, как копировать данные таким образом, используя только Eigen
один проход.
Спасибо за помощь.