Можно получить тип Eigen::MatrixBase‹T› &

Имея Eigen::MatrixBase и данные, есть ли способ узнать, является ли это матрицей с плавающей запятой или двойной? Мне нужно создать новую сложную матрицу того же размера и типа, что и MatrixBase.

Если это MatrixXf, то мне нужно создать MatrixXcf, а если MatrixXd, мне нужен MatrixXcD.?

template <typename A>
        int dowork(const Eigen::MatrixBase<A>& data)

person Poul K. Sørensen    schedule 01.03.2013    source источник
comment
Разве вы еще не знаете тип через тип шаблона A?   -  person congusbongus    schedule 01.03.2013
comment
Я бы предположил, что A содержит информацию да, но я не знаю, как использовать это для создания моей сложной матрицы с плавающей запятой или сложной двойной матрицы.   -  person Poul K. Sørensen    schedule 01.03.2013
comment
Нет, A будет типом матрицы.   -  person Shafik Yaghmour    schedule 01.03.2013
comment
Но как мне создать MatrixXcf или MatrixXcd в зависимости от типа матрицы A?   -  person Poul K. Sørensen    schedule 01.03.2013


Ответы (2)


Это довольно просто, просто используйте определение типа A::RealScalar для создания сложного типа:

template <typename A>
int dowork(const Eigen::MatrixBase<A>& data) {
    typedef Matrix<std::complex<typename A::RealScalar, Dynamic, Dynamic> MatCplx;
    ...
person ggael    schedule 01.03.2013
comment
Разве A::Scalar не будет std::complex‹float или double›, и тогда ваш код будет std::complex‹std::complex‹float или double››? - person Poul K. Sørensen; 01.03.2013
comment
@ s093294 Возможно, это опечатка, но даже если это так, ее легко исправить. В любом случае, один из Matrix<std::complex<typename A::Scalar>, Dynamic, Dynamic> или Matrix<typename A::Scalar, Dynamic, Dynamic> должен работать. (Бьюсь об заклад, что это последнее, но я не знаю навскидку.) - person us2012; 01.03.2013
comment
в вашем вопросе говорилось, что dowork принимает матрицу с плавающей запятой или двойную, поэтому A:: Scalar должен быть либо с плавающей запятой, либо с двойной. Теперь, если dowork также может принимать сложные типы, тогда используйте A:: RealScalar, чтобы быть уверенным, как в моем измененном ответе. - person ggael; 01.03.2013

Я не на 100 процентов уверен, что понимаю заданный вопрос, но я думаю, вы просите выделить другую матрицу того же типа времени после выполнения некоторого условия? Вы хотите, чтобы эта новая матрица не допускала типы данных, которые не соответствуют типу?

Если нет, поскольку вы используете классы шаблонов, у вас есть большая свобода и вы можете просто использовать общие типы данных шаблона. Также рассмотрите представление матрицы с использованием векторных форматов для простоты использования. Может быть, даже такие разреженные форматы

// Local variables used.
int a = 0;
int b = 0;
int endN, endM;

// Iterates through matrix checking when last matrix value is reached for end point.
while (endN != sizeN && endM != sizeM) {
    if (a == sizeN) {
        b++;
        a = 0;
        endM = b;
    } else {
        if (Matrix[a][b] != 0) {
            // Stores non-zero matrix values in queue SpareseFormat.
            SparseFormat.push(a);
            SparseFormat.push(b);
            SparseFormat.push(Matrix[a][b]);
        }
        endN = a;
        a++;
    }
}

Извините, если я совершенно не понял вашего вопроса. Это была долгая ночь :P

person Shawn    schedule 01.03.2013