У меня есть матрица M, каждый элемент которой зависит от одной переменной t в другой квадратичной форме без константы.
Просто, например,
M[1,1] = 2t^2 + 4t
M[3,2] = t^2 - 5t
M[2,4] = -t^2 + 5t
Матрица получается после серии вычислений, и каждый элемент или, скажем, коэффициенты до t ^ 2 и t вычисляются с помощью комбинации других функций.
Мне было интересно, как я могу сохранить матрицу как функцию M (t), чтобы каждый раз я мог вызывать функцию для генерации матрицы с разными t.
Спасибо!
ОБНОВИТЬ:
Цель состоит в том, чтобы получить наименьшее собственное значение матрицы при различных значениях t, поэтому я подумал, что мог бы каждый раз генерировать матрицу и передавать ее в решатель собственных значений для получения наименьшего собственного значения для каждого t.
Из моего ограниченного понимания, что вы после того, как функция в конкретный момент, для этого я бы использовал std::function<double(double)>
(то есть функция, которая принимает один двойной и возвращает двойной (результат.) Я думаю, что это то, что вы после? И каждое местоположение матрицы может быть инициализировано с лямбда — например,
// Assume my dumb matrix is a 2d vector
vector<vector<function<double(double)>>> matrix;
matrix[1][1] = [](double t) { return /* formula for: 2t^2 + 4t */ ; }
и т.п.
Вы должны создать имя класса Matrix, и этот класс имеет конструктор, который имеет только один параметр t.
// quadratic polynomial
class QuadPoly {
public:
QuadPoly(double _c2, double _c1, double _c0) : c2(_c2), c1(_c1), c0(_c0) {}
// ... other constructors, assignment
double operator()(double t) const {return (c2*t+c1)*t+c0;}
// ... maybe operator+ operator-, if necessary
private:
double c0, c1, c2;
};
// numerical Matrix
template<class T> class Matrix {
public:
// ... constructors, destructor, assignment
const T& operator()(int row, int col) const;
T& operator()(int row, int col);
// ... anything else
friend class QuadPolyMatrix;
private:
int nRows, nCols;
int nVals; // nRows*nCols
double* pVals; // or maybe double**
};
// matrix of quadratic polynomials
class QuadPolyMatrix : public Matrix<QuadPoly> {
public:
Matrix<double> operator() (double t) const;
};
1. Функции жестко закодированы
Если вам действительно нужен матричный объект, вы можете создать класс с t в конструкторе и функции, которая возвращает значения.
class CMatrix {
public:
CMatrix( double t_ ) : t( t_ ) {}
double GetElement( int row, int col ) const {
if( row == 3 && col == 2 ) {
return t * t - t * 5;
} else if( ) ...
}
private:
double t;
};
После этого вы можете построить CMatrix mat( t );
А затем получить элементы по mat.GetElement( 3, 2 );
,
2. Более универсальный вариант.
Делать typedef
функций (все они имеют одинаковую подпись double f( double t )
) и массив указателей на функции. Затем вы можете сделать SetFunction
метод, который устанавливает функцию в заданной координате и GetElement
вызывает функцию в заданной координате с параметром, который хранится в поле (как предыдущий пример). Но в этом случае вы должны установить все необходимые функции перед вызовом.