скопировать одну собственную матрицу векторов - PullRequest
0 голосов
/ 30 апреля 2019

у меня

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 один проход.

Спасибо за помощь.

...