Постоянная матрица с надстройкой убла

Я хотел бы определить постоянную матрицу 3x3 с повышением, как это, и она никогда не изменится во время выполнения:

[1 2 3
 4 5 6
 7 8 9] 

Эта матрица будет членом класса. Итак, могу ли я определить и инициализировать постоянную матричную переменную как член класса, как примитивные типы? Когда я пытаюсь ввести const для переменной someMatrix, я не могу назначить матричные данные в конструкторе и получить эту ошибку:

error: assignment of read-only location '((Test*)this)->Test::someMatrix.boost::numeric::ublas::matrix<double>::operator()(0, 0)'

Вот коды:

test.h

#ifndef TEST_H_
#define TEST_H_

#include <boost/numeric/ublas/matrix.hpp>

namespace bnu = boost::numeric::ublas;

class Test {
private:
    const double a = 1;
    const double b = 2;
    const double c = 3;
    const double d = 4;
    const double e = 5;
    const double f = 6;
    const double g = 7;
    const double h = 8;
    const double i = 9;
    const bnu::matrix<double> someMatrix;

public:
    Test();
    virtual ~Test();
};

#endif /* TEST_H_ */

test.cpp

Test::Test(){
    someMatrix(0,0) = a;
}

main.cpp

include "Test.h"

int main() {
    Test * t = new Test();

}

На самом деле я хочу найти способ определить someMatrix следующим образом:

const bnu::matrix<double> someMatrix(3,3) = {a,b,c,d,e,f,g,h,i};

2 ответа

Решение

Вы могли бы написать вспомогательную функцию, чтобы сделать это

class Test {
private:
    const bnu::matrix<double> someMatrix;
    static bnu::matrix<double> initSomeMatrix();
public:
    Test();
    virtual ~Test();
}

Test::Test() : someMatrix(initSomeMatrix()) {
}

bnu::matrix<double> Test::initSomeMatrix() {
    bnu::matrix<double> temp(3, 3);
    temp(0,0) = 1;
    ...
    return temp;
}

RVO должен сделать это достаточно эффективным.

С помощью <boost/numeric/ublas/assignment.hpp> Вы можете вставить значения в ublas::matrix или же ublas::vector с помощью <<= что позволяет вам установить вашу матрицу следующим образом:

bnu::matrix<double> a(3,3); a <<=  0, 1, 2,
                                   3, 4, 5,
                                   6, 7, 8;

Чтобы сделать его постоянным, просто скопируйте его:

const bnu::matrix<double> b = a;

ЗДЕСЬ - рабочий минимальный пример, скопированный отсюда

Другие вопросы по тегам