Постоянная матрица с надстройкой убла
Я хотел бы определить постоянную матрицу 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;