Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с матрицами, Где косяк в коде? 
:(
    Опции темы
hello19
Дата 29.7.2011, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.7.2011

Репутация: нет
Всего: нет



Вообщем нужно к матрице коэффициентов системы линейных уравнений дописать справа столбец свободных членов. Написал код. На маленьких матрицах работает, а на больших - нет Помогите!
Код

using namespace std;
 
int main()
{
        ifstream fin11("5.txt");
        int range = 3;
        double*free = new double[range];
        int qwer = 0;
        while ( fin11 >> free[qwer])
        { qwer++; }
        fin11.close();
 
        ifstream fin1("4.txt");
        ofstream ofs3("3.txt");
        char a;
        int i = 0;
        while(!fin1.eof())
        {
                a = fin1.get();
                if ( fin1.eof() ) break;
                if ( a == '\n' ){ ofs3 << free[i] << endl;} else
                { ofs3 << a; }
        }
        fin1.close();
        ofs3.close();
delete[] free;


Работаю с матрицей порядка 3638.

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  _________________.rar 76,58 Kb
PM MAIL WWW   Вверх
boostcoder
Дата 29.7.2011, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



прекращай темы плодить. только я уже вижу третью тему.

этот код может не работать лишь по одной причине: ты выходишь за границу free.
PM WWW   Вверх
spyswamp
Дата 29.7.2011, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 349
Регистрация: 18.8.2006

Репутация: 1
Всего: 7



boostcoder, видимо, готовится к летней пересдаче по программрованию. smile


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
Dem_max
Дата 29.7.2011, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



халява приди ???


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
hello19
Дата 29.7.2011, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.7.2011

Репутация: нет
Всего: нет



Помогите код то подправить
PM MAIL WWW   Вверх
bsa
Дата 29.7.2011, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




 ! 
bsa
hello19, прекращай плодить однородные темы!!!

У тебя ошибка в том коде, который занимается загрузкой. У тебя массив free на 3 элемента. А сколько в файле чисел?
PM   Вверх
hello19
Дата 1.8.2011, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 13.7.2011

Репутация: нет
Всего: нет



Нашел программу для решения систем алгебраических уравнений.
Работает, но на маленьких матрицах. Запустил на матрице порядка 3000 - не работает. в чем ошибка не пойму
Код

#include <stdio.h>
#include <process.h>
#include <sstream>
#include <fstream>
#include <iostream>
 
using namespace std;
 
float **a, *b, *x;
int N;
char filename[256];
FILE* InFile=NULL;
void count_num_lines(){
   //count number of lines in input file - number of equations
   int nelf=0;       //non empty line flag
   do{
       nelf = 0;
       while(fgetc(InFile)!='\n' && !feof(InFile)) nelf=1;
       if(nelf) N++;
   }while(!feof(InFile));
}
 
void freematrix(){
   //free memory for matrixes
   int i;
   for(i=0; i<N; i++){
       delete [] a[i];
   }
   delete [] a;
   delete [] b;
   delete [] x;
}
 
void allocmatrix(){
   //allocate memory for matrixes
   int i,j;
   x = new float[N]();
   b = new float[N]();
   a = new float*[N]();
   if(x==NULL || b==NULL || a==NULL){
       printf("\nNot enough memory to allocate for %d equations.\n", N);
       exit(-1);
   }
   for(i=0; i<N; i++){
       a[i] = new float[N];
       if(a[i]==NULL){
           printf("\nNot enough memory to allocate for %d equations.\n", N);
       }
}
 
void readmatrix(){
   int i=0,j=0;
   //read matrixes a and b from input file
   for(i=0; i<N; i++){
       for(j=0; j<N; j++){
           fscanf(InFile, "%f", &a[i][j]);
       }
       fscanf(InFile, "%f", &b[i]);
   }
}
 
//void printmatrix(){
//   //print matrix "a"
//   int i=0,j=0;
//   printf("\n");
//   for(i=0; i<N; i++){
//       for(j=0; j<N; j++){
//         printf(" %+f*X%d", a[i][j], j);
//       }
//       printf(" =%f\n", b[i]);
//   }
//}
 
//void testsolve(){
//   //test that ax=b
//   int i=0,j=0;
//   printf("\n");
//   for(i=0; i<N; i++){
//       float s = 0;
//       for(j=0; j<N; j++){
//         s += a[i][j]*x[j];
//       }
//       printf("%f\t%f\n", s, b[i]);
//   }
//}
void printresult(){
   int i=0;
   ofstream ofsx("x.txt");
   printf("\n");
   printf("Result\n");
   for(i=0; i<N; i++){
           ofsx << x[i] << endl;
       //printf("X%d = %f\n", i, x[i]);
   }
}
void diagonal(){
   int i, j, k;
   float temp=0;
   for(i=0; i<N; i++){
       if(a[i][i]==0){
           for(j=0; j<N; j++){
               if(j==i) continue;
               if(a[j][i] !=0 && a[i][j]!=0){
                   for(k=0; k<N; k++){
                       temp = a[j][k];
                       a[j][k] = a[i][k];
                       a[i][k] = temp;
                   }
                   temp = b[j];
                   b[j] = b[i];
                   b[i] = temp;
                   break;
               }
           }
       }
   }
}
void cls(){
   for(int i=0; i<25; i++) printf("\n");
}
void main(){
   int i=0,j=0, k=0;
   cls();
   do{
       printf("\nInput filename: ");
       scanf("%s", filename);
       InFile = fopen("3.txt", "rt");
   }while(InFile==NULL);
   count_num_lines();
   allocmatrix();
   rewind(InFile);
   //read data from file
   readmatrix();
   //check if there are 0 on main diagonal and exchange rows in that case
   diagonal();
   fclose(InFile);
   //printmatrix();
   //process rows
   for(k=0; k<N; k++){
       for(i=k+1; i<N; i++){
           if(a[k][k]==0){
               printf("\nSolution is not exist.\n");
               return;
           }
           float M = a[i][k] / a[k][k];
           for(j=k; j<N; j++){
               a[i][j] -= M * a[k][j];
           }
           b[i] -= M*b[k];
       }
   }
   //printmatrix();
   for(i=N-1; i>=0; i--){
       float s = 0;
       for(j = i; j<N; j++){
           s = s+a[i][j]*x[j];
       }
       x[i] = (b[i] - s) / a[i][i];
   }
 
   InFile = fopen(filename, "rt");
   readmatrix();
   fclose(InFile);
   //printmatrix();
   //testsolve();
   printresult();
   freematrix();
}

программа считывает из файла матрицу и столбец свободных членов. 
Матрица и столбец, которые я должен решить, прикрепил в топику.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  ________________________________.rar 76,57 Kb
PM MAIL WWW   Вверх
bsa
Дата 1.8.2011, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




 ! 
bsa
Я так понял, кто-то не умеет читать Правила, п.1

ПРЕКРАТИ ДУБЛИРОВАТЬ ТЕМЫ
У тебя всего одна задача - сделать программу, которая считает матрицы. Но тем ты наплодил уже с десяток, наверное (подозреваю, что у меня меньше за все годы присутствия на форуме!!!). Темы ты называешь так, как правилах их называть запрещено. В итоге, все они фактически являются одной!
PM   Вверх
bsa
Дата 1.8.2011, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Код
#include <iostream>
#include <vector>
#include <iterator>
#include <fstream>
#include <string>
#include <sstream>
#include <algorithm>
#include <stdexcept>

template<typename T>
class Matrix
{
public:
   Matrix() : cols_(0), rows_(0) {}
   Matrix(int cols, int rows) : cols_(cols), rows_(rows), data_(cols*rows) {}
   Matrix column(int index) const;
   Matrix row(int index) const;
   Matrix& operator+=(const Matrix &m);
   Matrix& operator-=(const Matrix &m);
   const T& operator()(int col, int row) const {
       return data_.at((row - 1) * cols_ + col - 1);
   }
   T& operator()(int col, int row) {
       return data_.at((row - 1) * cols_ + col - 1);
   }
   void swap(Matrix &m) {
      std::swap(cols_, m.cols_);
      std::swap(rows_, m.rows_);
      std::swap(data_, m.data_);
   }
   template<typename Type>
   friend std::istream& operator>>(std::istream &stream, Matrix<Type> &m);
   template<typename Type>
   friend std::ostream& operator<<(std::ostream &stream, const Matrix<Type> &m);
   template<typename Type>
   friend Matrix operator*(const Matrix<Type> &m1, const Matrix<Type> &m2);
   template<typename Type>
   friend Matrix operator*(const Matrix<Type> &m1, Type value);
private:
    int cols_;
    int rows_;
    std::vector<T> data_;
};

template<typename T>
std::istream& operator>>(std::istream &stream, Matrix<T> &m)
{
   std::string line;
   m.rows_ = 0;
   m.cols_ = 0;
   m.data_.clear();
   while(std::getline(stream, line)) {
      std::istringstream is(line);
      size_t oldSize = m.data_.size();
      std::copy(std::istream_iterator<T>(is), std::istream_iterator<T>(), std::back_inserter(m.data_));
      size_t newCols = m.data_.size() - oldSize;
      if (m.cols_ == 0)
          m.cols_ = newCols;
      else if (m.cols_ != newCols)
          throw std::runtime_error("Invalid file data");
      ++m.rows_;
   }
   return stream;
}

template<typename T>
std::ostream& operator<<(std::ostream &stream, const Matrix<T> &m)
{
   size_t idx = 0;
   for(int r = 1; r <= m.rows_; ++r) {
      for(int c = 1; c <= m.cols_; ++c, ++idx) {
         stream << m(c, r) << ' ';
      }
      stream << '\n';
   }
   return stream;
}

template<typename T>
Matrix<T> operator*(const Matrix<T> &m1, const Matrix<T> &m2)
{
    if (m1.cols_ != m2.rows_)
       throw std::runtime_error("Invalid matrix dimensions for multiplication");
    Matrix<T> ret(m2.cols_, m1.rows_);
    for(int r = 1; r <= ret.rows_; ++r) {
       for(int c = 1; c <= ret.cols_; ++c) {
          T &v = ret(c, r);
          for(int i = 1; i <= m1.cols_; ++i)
             v+= m1(i, r) * m2(c, i);
       }
    }
    return ret;
}

int main()
{
    std::ifstream input("matrix.txt");
    Matrix<double> m;
    input >> m;
    std::cout << m;
    return 0;
}


Остальное, надеюсь, допишешь сам.
PM   Вверх
bsa
Дата 1.8.2011, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



И вообще, чем uBlas не подошел? Ведь для него есть уже готовые алгоритмы инвертирования, например.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1023 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.