Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Stanislav Shwartsman                 2:400/520      04 Oct 2002  08:04:35
 To : Vladislav Terehov
 Subject : Посчитать определитель 'вручную'
 -------------------------------------------------------------------------------- 
 
 
 04 Oct 02 00:23, you wrote to me:
 
  VT>>> Существует ли что-нибудь более изящное, чем банальный пеpебоp
  VT>>> всех возможных пpеобpазований?
  SS>>  Это называется метод Гаусса - приведение матрицы к треугольному
  SS>> виду.
 
  VT> *Алгоpитм (или исходняк на чём угодно) в студию плз.*
 
  VT> Да,  важное условие, пpиведение к тpеугольному виду должно пpоисходить
  VT> не абы как, а так, чтобы это было похоже на pешение вpучную (нужны все
  VT> пpомежуточные pезультаты). Т.е в алгоpитме должен пpисутсвовать некий
  VT> оценщик кpасивости очеpедного пpеобpазования. Да?
 
    А книжку почитать ?
    В библиотеке давно последний раз был ?
 
    Ладно, максимальную оптимизированность и красоту не гарантирую.
    Главное, что работает ! ;)
 
 /************************** service public members ***************************/
 
 bool TMatrix :: triangle()
 {
    unsigned int i, j, row, d=min(rows, cols);
 
    for (row=0; row < d; row++)
    {
     if (rindex[row][row] == 0)  /* change pivot if need */
     {
         for (i=row; i<rows; i++)
             if (rindex[i][row] != 0) break;
 
         if (i == row) return false;
         swaprows(i, row);
     }
 
     /* triangulation */
     for(i = row+1; i<rows; i++) {
             double scalar = rindex[i][row] / rindex[row][row];
             for(j=0; j<cols; j++) rindex[i][j] -= rindex[row][j] * scalar;
         }
    }
 
    return true;
 }
 
 bool TMatrix :: triangle_with_scp_pivoting()
 {
    for (unsigned int row=0, d=min(rows, cols); row<d; row++)
    {
         /* scaling & pivoting */
     if(do_row_scaling(row) == false ||
         do_maximum_column_pivoting(row) == false) return false;
 
     /* triangulation */
     for(unsigned int i = row+1; i<rows; i++)
     {
         double scalar = rindex[i][row] / rindex[row][row];
         for(unsigned int j=0; j<cols; j++)
             rindex[i][j] -= rindex[row][j]*scalar;
         }
    }
 
    return true;
 }
 
 bool TMatrix :: do_maximum_column_pivoting(unsigned int row)
 {
    unsigned int j = row;
    double big = 0;
 
    /* find maximum column pivot */
    for (unsigned int i = row; i<rows; i++) {
     if (fabs(rindex[i][row]) > big) {
         big = fabs(rindex[i][row]);
         j = i;
     }
    }
 
    if (big == 0) return false;
    swaprows(j, row);
    return true;
 }
 
 bool TMatrix :: do_row_scaling(unsigned int row)
 {
    double big = 0;
    unsigned int i, d = min(rows, cols);
 
    /* find row biggest element */
    for (i=0; i<d; i++) {
     if (fabs(rindex[row][i]) > big) big = fabs(rindex[row][i]);
    }
 
    if (big == 0) return false;
 
    /* and scale ... */
    for (i=0; i<cols; i++) rindex[row][i] /= big;
    return true;
 }
 
     E-mail: gate@fidonet.org.il
     Voice Phones: 972-4-8330554 (home), 972-5-4481073 (cell)
 
 Bye !
 Stanislav     (AKA Night's Man)                        [Team Technion]
 ---
  * Origin: Gate From Another World ... From Haifa, Israel (2:400/520)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 Посчитать определитель \'вручную\'   Vladislav Terehov   30 Sep 2002 20:59:55 
 Re: Посчитать определитель \'вручную\'   Sergey Voloshchuk   03 Oct 2002 09:18:09 
 Посчитать определитель \'вручную\'   Vladislav Terehov   04 Oct 2002 00:22:38 
 Посчитать определитель \'вручную\'   Stanislav Shwartsman   03 Oct 2002 08:55:41 
 Посчитать определитель \'вручную\'   Vladislav Terehov   04 Oct 2002 00:23:33 
 Посчитать определитель \'вручную\'   Stanislav Shwartsman   04 Oct 2002 08:04:35 
 RE: Посчитать опpеделитель \'вpучную\'   Kropov Valentine   20 Oct 2002 14:29:25 
Архивное /ru.algorithms/17853d9d3112.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional