Как сохранить параметрическую матрицу как функцию в переполнении стека

У меня есть матрица 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.

1

Решение

Из моего ограниченного понимания, что вы после того, как функция в конкретный момент, для этого я бы использовал 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 */ ; }

и т.п.

1

Другие решения

Вы должны создать имя класса Matrix, и этот класс имеет конструктор, который имеет только один параметр t.

0

// 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;
};
0

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 вызывает функцию в заданной координате с параметром, который хранится в поле (как предыдущий пример). Но в этом случае вы должны установить все необходимые функции перед вызовом.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector