Собственно, как мне аккуратно добавить матрицы в контейнер l oop? - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть этот код, который использует Eigen:

struct Boundary
{
    Eigen::VectorXi VL;
    Eigen::MatrixXi EL;
    double length;
    bool isHole;
    bool isBoundary;
    bool isMainBoundary;
};

    int boundaryLoops = {};
    int boundariesNo = {};
    int holes = {};
    std::vector<Boundary> boundaries = {};

    MatrixXi SEUV;

    // ***** get all those boundaries here ****
    if (!CheckBoundaries(boundaryLoops, boundariesNo, holes, 
    boundaries))return false;

    // resize all loops container
    long size = {};
    for (auto &&boundary : boundaries){
        size += boundary.EL.rows();
    }
    SEUV.resize(size, 2);

    for (auto &&boundary : boundaries)
    {

        SEUV << boundary.EL; // Too few coefficients passed to comma initializer (operator<<)
        SEUV << SEUV, boundary.EL; // Too many rows passed to comma initializer (operator<<)
    }

Есть ли быстрый способ сделать это, кроме обычного подсчета столбцов и строк? Это повторяется, поэтому я ищу самое чистое решение

Спасибо

1 Ответ

1 голос
/ 25 февраля 2020

Если вы хотите добавить матрицы по строкам, вы должны убедиться, что количество столбцов равно.

При изменении размера необходимо учитывать предыдущее количество строк и сохранять матрицу перед изменением ее размера. .

SEUV << boundary.EL

терпит неудачу, потому что матрица SEUV уже изменена и имеет больше строк, чем boundary.EL

SEUV << SEUV, boundary.EL

, потому что SEUV занимает все пространство самого себя, там не осталось места для boundary.EL

Вот пример того, как можно добавить 2 матрицы с 3 столбцами и разными строками:

MatrixXi A(3,3);
A << 1, 1, 1, 1, 1, 1, 1, 1, 1;
cout << A << "\n\n";

MatrixXi B(2,3) ;
B << 2, 2, 2, 2, 2, 2;
cout << B << "\n\n";

MatrixXi tmp = A;
A.resize(A.rows() + B.rows(), NoChange);
A << tmp, B;
cout << A << "\n";
...