Интересно посмотреть на вашу реализацию
Не вопрос)
diagonalmatrix.h
C++ (Qt)
#ifndef DIAGONALMATRIX_H
#define DIAGONALMATRIX_H
#include <QVector>
class DiagonalMatrix
{
public:
DiagonalMatrix(int dim = 100);
QVector<double> operator()(QVector<QVector<double> > &a,
QVector<double> &b, bool *isValid = 0) const;
int dimension() const { return _dim; }
private:
int _dim; // dimension
};
#endif // DIAGONALMATRIX_H
diagonalmatrix.cpp
C++ (Qt)
#include "diagonalmatrix.h"
DiagonalMatrix::DiagonalMatrix(int dim)
: _dim(dim)
{
}
QVector<double> DiagonalMatrix::operator()(QVector<QVector<double> > &a,
QVector<double> &b, bool *isValid) const
{
static QVector<double> x(_dim);
if (a.size() != (int)_dim) {
if (isValid) {
*isValid = false;
return x;
}
}
foreach(QVector<double> row, a) {
if (row.size() != (int)_dim) {
if (isValid)
*isValid = false;
return x;
}
}
for (int i = 0; i < _dim-1; i++) {
QVector<double> row = a[i];
double c = -a[i+1][i]/row[i]; // NOTE!! if row[i] == 0, то капец!! Так что думайте сами))
for (int j = i; j < _dim; j++) {
a[i+1][j] += c * a[i][j];
}
b[i+1] += c * b[i];
}
for (int i = _dim - 1; i > 0; i--) {
QVector<double> row = a[i];
double c = -a[i-1][i]/row[i]; // NOTE!! if row[i] == 0, то капец!! Так что думайте сами))
for (int j = i; j == 0; j--) {
a[i-1][j] += c * a[i][j];
}
b[i-1] += c * b[i];
}
for (int i = 0; i < _dim; i++)
x[i] = b[i]/a[i][i];
return x;
}
А вот так енто используется:
main.cpp
C++ (Qt)
#include <iostream>
#include "diagonalmatrix.h"
using namespace std;
int main()
{
DiagonalMatrix dm(2);
QVector<QVector<double> > a(2, QVector<double>(2));
a[0][0] = 1.0;
a[0][1] = 2.0;
a[1][0] = 2.0;
a[1][1] = -1.0;
QVector<double> b(2);
b[0] = 1.0;
b[1] = -3.0;
QVector<double> x = dm(a, b);
for (int i = 0; i < dm.dimension(); i++)
cout << x[i] << endl;
return 0;
}
Разумеется здесь:
C++ (Qt)
double c = -a[i-1][i]/row[i]; // NOTE!! if row[i] == 0, то капец!! Так что думайте сами))
Нужно всегда проверять это условие..
Во-вторых может в принципе оказаться, что система ваша не совместна..
Вообще, на мой взгляд нужно в public секции класса добавить что-то вроде:
C++ (Qt)
enum State {NoProblem = 0, NotCompatible, ErrDimension, ну и т.д. по фкусу))}
и следовательно передовать вместо указателя на bool, указатель на State..
типа так:
C++ (Qt)
State st;
DiagonalMatrix dm(2);
...
QVector<double> x = dm(a, b, &st);
...
так было бы информативнее..
А вообще уже есть готовая библиотека, работающая с матрицами.. Где-то на форуме тема проскальзывала)