Russian Qt Forum
Октябрь 01, 2024, 18:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 2 3 [4]   Вниз
  Печать  
Автор Тема: максимальное количество елементов в двумерном масиве  (Прочитано 27555 раз)
m_ax
Джедай : наставник для всех
*******
Online Online

Сообщений: 2095



Просмотр профиля
« Ответ #45 : Апрель 29, 2010, 19:16 »

Цитировать
Интересно посмотреть на  вашу реализацию
Не вопрос)

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);
...
 
 
так было бы информативнее..
А вообще уже есть готовая библиотека, работающая с матрицами.. Где-то на форуме тема проскальзывала)
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Online Online

Сообщений: 2095



Просмотр профиля
« Ответ #46 : Апрель 29, 2010, 19:17 »

Млин, забыл исходники прикрутить))
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Ubuntu_linux
Гость
« Ответ #47 : Апрель 29, 2010, 20:22 »

Цитировать
А вообще уже есть готовая библиотека, работающая с матрицами.. Где-то на форуме тема проскальзывала)
Ну вообще то мне нужен только метод прогонки для матриц. И если сделаешь сам, то можно сделать как захочешь и как тебе будет удобнее. Подмигивающий
Записан
m_ax
Джедай : наставник для всех
*******
Online Online

Сообщений: 2095



Просмотр профиля
« Ответ #48 : Апрель 29, 2010, 20:38 »

Цитировать
Ну вообще то мне нужен только метод прогонки для матриц
Что вы понимаете под прогонкой матриц?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Ubuntu_linux
Гость
« Ответ #49 : Апрель 29, 2010, 20:55 »

тут все сказано вот
 ;)спасибо за помощь! Подмигивающий если что то обращайтесь.
« Последнее редактирование: Апрель 29, 2010, 21:09 от Ubuntu_linux » Записан
Sancho_s_rancho
Гость
« Ответ #50 : Май 03, 2010, 21:27 »

На тему динамического двумерного массива могу предложить это.
Двумерный шаблонный массив с ресайзом через qMalloc/qRealloc. В большинстве случаев достаточно.


Записан
Ubuntu_linux
Гость
« Ответ #51 : Май 05, 2010, 19:16 »

 Непонимающий
Возник еще один вопрос, я в свой класс MainWindow добавил еще диалоговый класс Dialog. Но мне нужно обращаться к переменным которые определены в главном классе MainWindow.
В классе Dialog я делаю так:
Код
C++ (Qt)
MainWindow ma(this);
ma.kadr;
но система ругается,
Цитировать
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
что мне сделать?
Записан
KuZ
Гость
« Ответ #52 : Май 05, 2010, 21:16 »

((MainWindow*)sender())->  вроде так должно пойти и если не ошибаюсь есть еще метод parent.
Записан
Ubuntu_linux
Гость
« Ответ #53 : Май 05, 2010, 22:39 »

Спасибо!
Я обдумал и решил пойти другим путем, то есть я из класса Dialog вытягиваю все флаги и переменные, а потом обрабатываю с помощью их нужны мне функции в главном классе Mainwindow.
Записан
Страниц: 1 2 3 [4]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.224 секунд. Запросов: 23.