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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как переделать HPP файл, Динамически задать 
V
    Опции темы
allsolovey
Дата 24.2.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Empty



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

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



Скачал с инета исходник степенного метода нахождения собственных значений матрицы,там размерность матрицы  константа и определяется через #define.мне надо чтоб пользователь её сам задавал.Я поменял в двух cpp файлах,в итоге все компилировалось но не работало.Оказалось что надо менять в HPP файле.Помогите как тут динамически задать Tvector,matrix,row,col.

Все файлы в оригинале

Chisla.cpp

Код

/*
   Степенной метод нахождения собственных значений и
   собственных векторов матриц
   
*/
#define MATRDIM 3
#define WRITETEMPLATE "%10.6f "

#include <conio.h>
#include "matrix.hpp"
#include "matrix.cpp"


void main(void) {

  TMatrix A,B;
  TVector x1,x,y;
  m_elem l1,l2,a;
  FILE *input;

  input=fopen("chisla.dat","rt");
  ReadMatr(A,input);
  clrscr();
  printf("Матрица A:\n");
  WriteMatr(A);
  l1=MaxChislo(A,0.00001,x1);
  printf("Макс. по модулю собств. число: %10.6f\n",l1);
  printf("                собств. вектор:\n");
  WriteVec(x1);
  getch();
  fclose(input);
}




MATRIX.CPP

Код

/*
  Модуль работы с матрицами

*/

#include <iostream.h>

m_elem Scalar(TVector a,TVector b) // Вычисление скалярного произведения
{                                  // двух векторов
  TIndex i;
  m_elem f=0;

  for(i=0;i<MATRDIM;i++)
    f+=a[i]*b[i];
  return(f);
}

void InitMatr(TMatrix &matrix) // Инициализация матрицы
{                              // заполнение индексных множеств
  TIndex i;                    // начальными значениями

  for(i=0;i<MATRDIM;i++) {
    matrix.row[i]=i;
    matrix.col[i]=i;
  }
}

m_elem NormaInf(m_elem *v)  // Вычисление нормы вектора
{
  m_elem max=(v[0])*(v[0]);
  TIndex i;

  for(i=1;i<MATRDIM;i++){
 max=max+(v[i])*(v[i]);}

max=sqrt(max);

return(max)  ;
}


void WriteMatr(TMatrix m,FILE *f) // Вывод матрицы на экран или в файл
{
  TIndex i,j;

  for(i=0;i<MATRDIM;i++)
  {
    for(j=0;j<MATRDIM;j++)
      fprintf(f,WRITETEMPLATE,matrix_elem(m,i,j));
    fprintf(f,"\n");
  }
}

void WriteVec(m_elem *v,FILE *f) // Вывод вектора на экран или в файл
{
  TIndex i;

  for(i=0;i<MATRDIM;i++)
    fprintf(f,WRITETEMPLATE,v[i]);
  fprintf(f,"\n");
}

void ReadMatr(TMatrix &m,FILE *f) // Чтение матрицы из файла
{
  TIndex i,j;
  m_elem t;

  InitMatr(m);
  for(i=0;i<MATRDIM;i++)
    for(j=0;j<MATRDIM;j++)
    {
      fscanf(f,"%f",&t);
      matrix_elem(m,i,j)=t;
    }
}

void ReadVec(m_elem *v,FILE *f) // Чтение вектора из файла
{
  TIndex i;

  for(i=0;i<MATRDIM;i++)
    fscanf(f,"%f ",&(v[i]));
}

void MatrVec(TMatrix A,m_elem *b,m_elem *c)
{                            // Результат умножения матрицы на вектор c=Ax
  TIndex i,j;

  for(i=0;i<MATRDIM;i++)
  {
    c[i]=0;
    for(j=0;j<MATRDIM;j++)
      c[i]+=matrix_elem(A,i,j)*b[j];
  }
}


m_elem MaxChislo(TMatrix A,m_elem eps,m_elem *yk)
{                   // Нахождение макс. по модулю собств. числа
  TVector y;        // с точностью до eps степенным методом
  m_elem l1=0,lk;
  TIndex j;
  unsigned int k;
cout<<"‚ўҐ¤ЁвҐ нЇбЁ«®­:";
cin>>eps;
  for (j=0;j<MATRDIM;j++) // €­ЁжЁ «Ё§Ёа㥬 ­ з «м­®Ґ ЇаЁЎ«Ё¦Ґ­ЁҐ y
    y[j]=1;
  k=0;
  do {
    lk=l1;
    MatrVec(A,y,yk);          // ‚лзЁб«пҐ¬ yk:=Ay

    l1=Scalar(yk, y)/Scalar(y,y);

    for(j=0;j<MATRDIM;j++)    // y:=yk;
    {
      y[j]=yk[j]/NormaInf(yk);


    }
    k++;
  if(fabs(l1-lk)<eps){
cout<<"Љ®«ЁзҐбвў® ЁвҐа жЁ©:"<<k<<endl;}
  } while (fabs(l1-lk)>=eps); // Пока точность не превысит eps

  return(l1);
}


TMatrix Mul(TMatrix A,TMatrix B) // Перемножение 2-х матриц
{
   TIndex i,j,k;
   m_elem sum;
   TMatrix R;

   InitMatr(R);
   for (i=0;i<MATRDIM;i++)
     for (j=0;j<MATRDIM;j++)
     {
       sum=0;
       for (k=0;k<MATRDIM;k++)
         sum+=matrix_elem(A,i,k)*matrix_elem(B,k,j);
       matrix_elem(R,i,j)=sum;
     }
     return(R);
}




MATRIX.HPP

Код


/*
  Заголовок модуля работы с матрицами
  
*/
#include <MATH.H>
#include <stdio.h>


#ifndef MATRDIM
  #define MATRDIM 3
#endif


#define matrix_elem(x,i,j) (x.matrix[x.row[i]][x.col[j]])
#ifndef WRITETEMPLATE
  #define WRITETEMPLATE "%10.5f "
#endif

typedef float m_elem;
typedef unsigned char TIndex;
typedef m_elem TVector[MATRDIM];

typedef struct {
  m_elem matrix[MATRDIM][MATRDIM];
  TIndex row[MATRDIM];
  TIndex col[MATRDIM];
  } TMatrix;

void InitMatr(TMatrix &matrix);
TMatrix Transp(TMatrix A);
m_elem Scalar(TVector a,TVector b);
void WriteMatr(TMatrix m,FILE *f=stdout);
void WriteVec(m_elem *v,FILE *f=stdout);
void ReadMatr(TMatrix &m,FILE *f=stdin);
void ReadVec(m_elem *v,FILE *f=stdin);
void MatrVec(TMatrix a,m_elem *b,m_elem *c);
m_elem MaxChislo(TMatrix A,m_elem eps,m_elem *yk);
TMatrix Mul(TMatrix A,TMatrix B);



Это сообщение отредактировал(а) allsolovey - 24.2.2009, 19:42
PM MAIL   Вверх
andrew_121
Дата 24.2.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



allsolovey, Из того что ты скинул, многовато не поймешь... Выкладывай все что есть.
Возможно помогу...не обещаю.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
allsolovey
Дата 24.2.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Empty



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

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



все выложил,компилятор у меня BC3.1 (может важно)

Это сообщение отредактировал(а) allsolovey - 24.2.2009, 19:45
PM MAIL   Вверх
andrew_121
Дата 24.2.2009, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



allsolovey, Ок. Помогу. Но тестить буду на VS2008. Стучи в асю.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
andrew_121
Дата 24.2.2009, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



А файлик "chisla.dat" где?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
zim22
Дата 24.2.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



allsolovey, тебе именно степенным методом надо или любой подойдёт?


--------------------
PM MAIL   Вверх
allsolovey
Дата 24.2.2009, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Empty



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

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



zim22 мне надо степенной доделать,а так у меня уже есть якоби и QL-алгоритм. Если есть отличный от этих, то буду признателен,мне для диплома все равно ещё один надо реализовывать.
PM MAIL   Вверх
zim22
Дата 24.2.2009, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



сделал вроде.
всё работает в msvc 2008.
ввод с клавиатуры, т.к. файла chisla.dat у меня нет. поэтому закомментил строчки в функции main, читающие из файла.

Chisla.cpp
Код
/*
   Степенной метод нахождения собственных значений и
   собственных векторов матриц
   
*/
//#define MATRDIM 3
int MATRDIM;
#define WRITETEMPLATE "%10.6f "

#include <conio.h>
#include "Matrix.h"
#include <iostream>


void main(void) {

    std::cout << "Vvedite  MATRDIM: ";
    std::cin >> MATRDIM;
    
  TMatrix A,B;
  TVector x1,x,y;
  m_elem l1,l2,a;
  FILE *input;

  input=fopen("chisla.dat","rt");
  //ReadMatr(A,input);
  
  ReadMatr(A);
  printf("Матрица A:\n");
  WriteMatr(A);
  l1=MaxChislo(A,0.00001,x1.data_);
  printf("Макс. по модулю собств. число: %10.6f\n",l1);
  printf("                собств. вектор:\n");
  WriteVec(x1.data_);
  getch();
  //fclose(input);
}



Matrix.cpp
Код
/*
  Модуль работы с матрицами

*/

#include <iostream>
#include "Matrix.h"
using namespace std;

extern int MATRDIM;

m_elem Scalar(m_elem *a,m_elem *b) // Вычисление скалярного произведения
{                                  // двух векторов
  TIndex i;
  m_elem f=0;

  for(i=0;i<MATRDIM;i++)
    f+=a[i]*b[i];
  return(f);
}

void InitMatr(TMatrix &matrix) // Инициализация матрицы
{                              // заполнение индексных множеств
  TIndex i;                    // начальными значениями

  for(i=0;i<MATRDIM;i++) {
    matrix.row[i]=i;
    matrix.col[i]=i;
  }
}

m_elem NormaInf(m_elem *v)  // Вычисление нормы вектора
{
  m_elem max=(v[0])*(v[0]);
  TIndex i;

  for(i=1;i<MATRDIM;i++){
 max=max+(v[i])*(v[i]);}

max=sqrt(max);

return(max)  ;
}


void WriteMatr(TMatrix m,FILE *f) // Вывод матрицы на экран или в файл
{
  TIndex i,j;

  for(i=0;i<MATRDIM;i++)
  {
    for(j=0;j<MATRDIM;j++)
      fprintf(f,WRITETEMPLATE,matrix_elem(m,i,j));
    fprintf(f,"\n");
  }
}

void WriteVec(m_elem *v,FILE *f) // Вывод вектора на экран или в файл
{
  TIndex i;

  for(i=0;i<MATRDIM;i++)
    fprintf(f,WRITETEMPLATE,v[i]);
  fprintf(f,"\n");
}

void ReadMatr(TMatrix &m,FILE *f) // Чтение матрицы из файла
{
  TIndex i,j;
  m_elem t;

  InitMatr(m);
  for(i=0;i<MATRDIM;i++)
    for(j=0;j<MATRDIM;j++)
    {
      fscanf(f,"%f",&t);
      matrix_elem(m,i,j)=t;
    }
}

void ReadVec(m_elem *v,FILE *f) // Чтение вектора из файла
{
  TIndex i;

  for(i=0;i<MATRDIM;i++)
    fscanf(f,"%f ",&(v[i]));
}

void MatrVec(TMatrix A,m_elem *b,m_elem *c)
{                            // Результат умножения матрицы на вектор c=Ax
  TIndex i,j;

  for(i=0;i<MATRDIM;i++)
  {
    c[i]=0;
    for(j=0;j<MATRDIM;j++)
      c[i]+=matrix_elem(A,i,j)*b[j];
  }
}


m_elem MaxChislo(TMatrix A,m_elem eps,m_elem *yk)
{                   // Нахождение макс. по модулю собств. числа
  TVector y;        // с точностью до eps степенным методом
  m_elem l1=0,lk;
  TIndex j;
  unsigned int k;
cout<<"‚ўҐ¤ЁвҐ нЇбЁ«®:";
cin>>eps;
  for (j=0;j<MATRDIM;j++) // €ЁжЁ «Ё§Ёа㥬  з «м®Ґ ЇаЁЎ«Ё¦ҐЁҐ y
    y[j]=1;
  k=0;
  do {
    lk=l1;
    MatrVec(A,y.data_,yk);          // ‚лзЁб«пҐ¬ yk:=Ay

    l1=Scalar(yk, y.data_)/Scalar(y.data_,y.data_);

    for(j=0;j<MATRDIM;j++)    // y:=yk;
    {
      y[j]=yk[j]/NormaInf(yk);


    }
    k++;
  if(fabs(l1-lk)<eps){
cout<<"Љ®«ЁзҐбвў® ЁвҐа жЁ©:"<<k<<endl;}
  } while (fabs(l1-lk)>=eps); // Пока точность не превысит eps

  return(l1);
}


TMatrix Mul(TMatrix A,TMatrix B) // Перемножение 2-х матриц
{
   TIndex i,j,k;
   m_elem sum;
   TMatrix R;

   InitMatr(R);
   for (i=0;i<MATRDIM;i++)
     for (j=0;j<MATRDIM;j++)
     {
       sum=0;
       for (k=0;k<MATRDIM;k++)
         sum+=matrix_elem(A,i,k)*matrix_elem(B,k,j);
       matrix_elem(R,i,j)=sum;
     }
     return(R);
}


Matrix.h
Код
/*
  Заголовок модуля работы с матрицами
  
*/
#include <MATH.H>
#include <stdio.h>

extern int MATRDIM;
//#ifndef MATRDIM
//  #define MATRDIM 3
//#endif


#define matrix_elem(x,i,j) (x.matrix[x.row[i]][x.col[j]])
#ifndef WRITETEMPLATE
  #define WRITETEMPLATE "%10.5f "
#endif

typedef float m_elem;
typedef unsigned char TIndex;

struct TVector
{
    TVector() {
        data_ = new m_elem[MATRDIM];
    }

    m_elem &operator[](int pos)
    {
        return data_[pos];
    }
    m_elem* data_;
};

struct TMatrix {
    TMatrix() {
        row = new TIndex[MATRDIM];
        col = new TIndex[MATRDIM];
        matrix = new m_elem*[MATRDIM];
        for (size_t i = 0; i < MATRDIM; ++i)
            matrix[i] = new m_elem[MATRDIM];
    }
  m_elem **matrix;
  TIndex *row;
  TIndex *col;  
};

void InitMatr(TMatrix &matrix);
TMatrix Transp(TMatrix A);
m_elem Scalar(m_elem *a,m_elem *b);
void WriteMatr(TMatrix m,FILE *f=stdout);
void WriteVec(m_elem *v,FILE *f=stdout);
void ReadMatr(TMatrix &m,FILE *f=stdin);
void ReadVec(m_elem *v,FILE *f=stdin);
void MatrVec(TMatrix a,m_elem *b,m_elem *c);
m_elem MaxChislo(TMatrix A,m_elem eps,m_elem *yk);
TMatrix Mul(TMatrix A,TMatrix B);




--------------------
PM MAIL   Вверх
allsolovey
Дата 25.2.2009, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Empty



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

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



zim22, Спасиба за помощь.
Chisla.dat это простой txt файл с матрицей без отдельно указанной размерности типа 

-4 -23 16 23 -18 
-2 -49 -1 24 -41 
-28 -42 -13 -32 -27 
17 -47 -33 31 25 
-44 -48 30 35 -39 


Компиляция не проходит, выдает предупреждение (40 строка в matrix.h ) functions containing for are not expanded inline.

PM MAIL   Вверх
zim22
Дата 25.2.2009, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Попробуй вынести определение конструктора TMatrix()  в файл Matrix.cpp
в файле Matrix.h оставь только объявление.


--------------------
PM MAIL   Вверх
bsa
Дата 25.2.2009, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(allsolovey @ 25.2.2009,  01:05)
Компиляция не проходит, выдает предупреждение (40 строка в matrix.h ) functions containing for are not expanded inline.

Предупреждение - это не повод для "непрохождения компиляции". Тем более, данное предупреждение вообще можно игнорировать - компиляторы от Borland не умеют встраивать функции, содержащие ряд конструкций, в частности циклы.
PM   Вверх
allsolovey
Дата 25.2.2009, 19:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Empty



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

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



в Matrix.cpp  вписал 
Код

TMatrix() {
        row = new TIndex[MATRDIM];
        col = new TIndex[MATRDIM];
        matrix = new m_elem*[MATRDIM];
        for (size_t i = 0; i < MATRDIM; ++i)
            matrix[i] = new m_elem[MATRDIM];
    }


а в Matrix.h оставил TMatrix();

В итоге:

Error matrix.cpp  Declaration terminated incorrectly

Error  matrix.h 22: Multyple declaration for 'TVector'
Error  matrix.h 35: Multyple declaration for 'TMatrix'
Error  matrix.h 51: Default argumet value redeclared for parameter 'f
Error  matrix.h 52:Default argumet value redeclared for parameter 'f
Error  matrix.h 53:Default argumet value redeclared for parameter 'f
Error  matrix.h 54:Default argumet value redeclared for parameter 'f'

номера строк как тут


PM MAIL   Вверх
zim22
Дата 25.2.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



TMatrix::TMatrix()


--------------------
PM MAIL   Вверх
allsolovey
Дата 25.2.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Empty



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

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



первая ошибка пропала,осталось 6 в matrix.h ((
PM MAIL   Вверх
zim22
Дата 25.2.2009, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(allsolovey @  25.2.2009,  19:19 Найти цитируемый пост)
Error  matrix.h 22: Multyple declaration for 'TVector'

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

Это сообщение отредактировал(а) zim22 - 25.2.2009, 20:38


--------------------
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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