C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Переведите кто может в С!
Daredevil
  Отправлено: 23.10.2004, 14:39


Ученик-кочегар

Группа: Участник
Сообщений: 22



У меня тут функция дана реализации метода Данилевского. Переведите ее пожалуйста на С, и по возможности, кто-нибудь объясните как она работает и что тут вообще происходит?(((
CODE
void danilevskyeigenvalues(ap::real_2d_array a, int n, ap::real_1d_array& q)
{
   int i;
   int j;
   int k;
   int l;
   int u;
   int recn;
   double t;
   double tmp;
   double maxa;
   bool succeed;
   ap::real_1d_array q1;
   ap::real_1d_array q2;
   ap::real_2d_array b;
   ap::real_2d_array c;

   b.setbounds(1, n, 1, n);
   c.setbounds(1, n, 1, n);
   q.setbounds(0, n);
   q1.setbounds(0, n);
   q2.setbounds(0, n);
   if( n==1 )
   {
       q(0) = a(1,1);
       q(1) = -1;
       return;
   }
   succeed = true;
   for(u = n; u >= 2; u--)
   {
       maxa = fabs(a(u,u-1));
       l = u-1;
       for(i = u-2; i >= 1; i--)
       {
           if( fabs(a(u,i))>maxa )
           {
               maxa = fabs(a(u,i));
               l = i;
           }
       }
       if( maxa==0 )
       {
           succeed = false;
           recn = u-1;
           break;
       }
       for(i = 1; i <= n; i++)
       {
           t = a(i,u-1);
           a(i,u-1) = a(i,l);
           a(i,l) = t;
       }
       for(i = 1; i <= n; i++)
       {
           t = a(u-1,i);
           a(u-1,i) = a(l,i);
           a(l,i) = t;
       }
       for(i = 1; i <= n; i++)
       {
           for(j = 1; j <= n; j++)
           {
               if( j!=u-1 )
               {
                   b(i,j) = a(i,j)-a(i,u-1)*a(u,j)/a(u,u-1);
               }
               else
               {
                   b(i,j) = a(i,j)/a(u,u-1);
               }
           }
       }
       for(i = 1; i <= n; i++)
       {
           for(j = 1; j <= n; j++)
           {
               if( i!=u-1 )
               {
                   c(i,j) = b(i,j);
               }
               else
               {
                   c(i,j) = 0;
                   for(k = 1; k <= n; k++)
                   {
                       c(i,j) = c(i,j)+a(u,k)*b(k,j);
                   }
               }
           }
       }
       for(i = 1; i <= n; i++)
       {
           for(j = 1; j <= n; j++)
           {
               a(i,j) = c(i,j);
           }
       }
   }
   if( succeed )
   {
       q(n) = -2*(n%2)+1;
       for(i = 0; i <= n-1; i++)
       {
           q(i) = -a(1,n-i)*q(n);
       }
   }
   else
   {
       q1(n-recn) = -2*((n-recn)%2)+1;
       for(i = 0; i <= n-recn-1; i++)
       {
           q1(i) = -a(recn+1,n-i)*q1(n-recn);
       }
       danilevskyeigenvalues(a, recn, q2);
       for(i = 0; i <= n; i++)
       {
           q(i) = 0;
       }
       for(i = 0; i <= n-recn; i++)
       {
           for(j = 0; j <= recn; j++)
           {
               q(i+j) = q(i+j)+q1(i)*q2(j);
           }
       }
   }
}

Sl@Sh
Отправлено: 23.10.2004, 18:40


Мастер участка

Группа: Участник
Сообщений: 383



Извените, вы имеете ввиду просто С или С++ ?
Daredevil
Отправлено: 24.10.2004, 12:10


Ученик-кочегар

Группа: Участник
Сообщений: 22



Я имею ввиду обычный С. А не С++!!
Doga
Отправлено: 24.10.2004, 15:08


Мастер участка

Группа: Участник
Сообщений: 575



Если Вы найдёте описания классов "real_1d_array" и "real_2d_array" в пространстве имён "ap", то Вы и сами всё сделаете. А что происходит, понятно — обыкновенная рекурсия biggrin.gif
Daredevil
Отправлено: 25.10.2004, 22:19


Ученик-кочегар

Группа: Участник
Сообщений: 22



а вы можете сказать сами? пожалуйста!!! мне очень надо!!!
Ну я не так хорошо понимаю в С, чтобы знать что такое обыкновенная рекурсия, помню, что рекурсия — это вызов функции самой себя, только на примере слабо это понимаю..
объясните конкретней пожалуйста!!!
Daredevil
Отправлено: 05.11.2004, 23:34


Ученик-кочегар

Группа: Участник
Сообщений: 22



Блин!! Ну кто нибудь может это сделать? Ну я абсолютно не знаю С++, а мне нужна эта функция в С!! Срочно!!! Ну пожалуйста, люди!!!
Doga
Отправлено: 06.11.2004, 15:01


Мастер участка

Группа: Участник
Сообщений: 575



Ещё раз повторяю, только если Вы найдёте описания используемых в коде классов "real_1d_array" и "real_2d_array". Пока недостаточно данных ... wink.gif

Вернуться в Вопросы программирования в C++Builder