Собственная матрица с блочной диагональной структурой - PullRequest
0 голосов
/ 08 октября 2019

Это запрос к библиотеке C ++ Eigen.

В моих вычислениях я часто сталкиваюсь с матрицами с блочной диагональной формой. Простой пример структуры приведен ниже.

Matrix6f M = Matrix6f::Zero(); //< M has a special structure
M.block<3, 3,>(0, 0) = Matrix3f::Random();
M.block<3, 3,>(3, 3) = Matrix3f::Random();

Matrix6f out = M * Matrix6f::Random(); //< Want to optimize this operation

Теперь, допустим, у меня плотная матрица 6x6 I и мне нужно оценить продукт M*I, есть ли способ избежать этого? выполнять избыточные умножения / сложения со всеми нулями, которые есть в M. Если не считать явного умножения, то есть.

У Eigen есть эта замечательная особенность, где, если я делаю auto u = v + w, я просто получаю оператор без фактической оценки. Похоже, это также работает с auto z = Matrix6f::Zero(), и если бы я когда-либо делал Matrix6f out = z + Matrix6f::Random(), я мог бы представить запись оператора на специальной матрице Zero, чтобы я эффективно просто возвращал элементы случайной матрицы, не пытаясь добавить ноль. к этому.

Возможно ли что-то подобное для конкретного примера, который у меня есть в списке выше?

1 Ответ

0 голосов
/ 08 октября 2019

Вы можете перегрузить оператор *, если вы используете новый класс для нулевой матрицы

Matrix6f operator*(const Zero &zero, const Matrix6f matrix) {
    Matrix6f outMatrix{};
    //do the math here
    return outMatrix;
}

Тем не менее, вам нужно измерить, приносит ли это какой-либо выигрыш в производительности.

...