Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Обратная матрица

1.7K
23 сентября 2006 года
alektrik
140 / / 16.01.2006
Нужно написать прогу... или хотя-бы подсказать быстрый алгоритм нахождения обратной матрицы для матрицы размером NxN, где N - любое целое положительное число больше нуля...

пробовал Гаусса, в принципе получилось, но на матрице:
1 2 2
4 8 6
7 8 9
алгоритм взял и загнулся

P.S. метод с помощью алгебраических дополнений не годится...
242
23 сентября 2006 года
Оlga
2.2K / / 04.02.2006
на форуме вроде уже есть решение
да и в полезных ссылках раздел студенты есть линки на алгоритмы ...

[COLOR=red]кросспостинг запрещен, читай правила форума[/COLOR]
242
23 сентября 2006 года
Оlga
2.2K / / 04.02.2006
Цитата:
пробовал Гаусса, в принципе получилось, но на матрице:
1 2 2
4 8 6
7 8 9
алгоритм взял и загнулся


загнулся видимо потому что ты не сделал проверки на значение пивота(не знаю как это по русски, надеюсь ты меня понял). во второй итерации пивот попадает на ноль, поэтому 2 и 3 строки матрицы (1 и 2, если индексация с нуля) надо поменять. т.е. проверки надо добавить + функцию которая меняет строки.

1.7K
23 сентября 2006 года
alektrik
140 / / 16.01.2006
не понял, что такое пивот... но знал, что там (во второй строке) получается нечто [0 0 x]... отсюда и глюк, а вот на счет перестановки не догадался... но всё равно хотелось бы алгоритм какой-нть пооптимизорованней, а то моё творение обратную матрицу 100х100 ищет секунд 25... а вот например взять Matlab - доли секунды и вуаля результ...
242
23 сентября 2006 года
Оlga
2.2K / / 04.02.2006
пивот - это контрольный элемент(если так можно выразиться) и он не может быть нулем. Например есть матрица A N*N, по методу Гаусса берем в 1-ой строке(0-ой строке) 1-ый элемент за пивот, переписываем эту строку без изменения, столбец обнуляем и делаем вычесление остальных элементов матрицы. короче пивот идет по главной диагонали матрицы N*N
а насчет перестановок строк - это прием из математики, также если хоть одна строка в матрице А для который ищем обратную матрицу обнуляется, тогда у неё нет обратной матрицы.

з.ы. если понял что такое пивот, скажи плиз как это по русски.
1.7K
23 сентября 2006 года
alektrik
140 / / 16.01.2006
ну в принципе перестановок апмалютна согласен из серии - если в системе уравнений уравнения переставить местами смысл не измениться... thanks за мыслю... вот думаю, если выкину сюда свою прогу на C# это будет нормально??? или лучше в раздел .NET Framework с темой типа "Помогите оптимизировать"??? как думаешь(-те) куда правильней будет???
242
23 сентября 2006 года
Оlga
2.2K / / 04.02.2006
бросай здесь, если надо модераторы твою тему переведут, только не в .NET Framework, а в Студенты.
если код большой пользуйся вложениями.
1.7K
23 сентября 2006 года
alektrik
140 / / 16.01.2006
Вырезка из кода:
Код:
public Matrix Inv
{
  get
  {
    if (!IsSquare)
      throw new MatrixMustBeSquare("Матрица должна быть квадратной");

    if (this.Det == 0)
      throw new Exception("Матрица вырожденная. Ошибка Inv");

    Matrix res = new Matrix(this);
               
    res = res.Join(Eye(this.rows), RowOrColumn.Row);

    for (int j = 0; j < res.rows; j++)
    {
      if (res[j, j] == 0)
      {
        Matrix tm = res.GetRow(j);
        for (int i = j + 1; i < res.rows; i++)
          if (res[i, j] != 0)
          {
            res = res.SetRow(j, res.GetRow(i));
            res = res.SetRow(i, tm);
            break;
          }
      }

      for (int i = j + 1; i < res.rows; i++)
      {
        Matrix tm1 = res.GetRow(i) - res.GetRow(j) * res[i, j] / res[j, j];
        res = res.SetRow(i, tm1);
      }
    }

    for (int j = res.rows - 1; j >= 0; j--)
    {
      if (res[j, j] == 0)
      {
        Matrix tm = res.GetRow(j);
        for (int i = j + 1; i < res.rows; i++)
          if (res[i, j] != 0)
          {
            res = res.SetRow(j, res.GetRow(i));
            res = res.SetRow(i, tm);
            break;
          }
      }
      for (int i = j - 1; i >= 0; i--)
      {
        Matrix tm1 = res.GetRow(i) - res.GetRow(j) * res[i, j] / res[j, j];
        res = res.SetRow(i, tm1);
      }

      Matrix tm2 = res.GetRow(j) / res[j, j];
      res = res.SetRow(j, tm2);
    }

     return res.GetSubMatrix(0, res.rows - 1, res.columns / 2, res.columns - 1);
  }
}

Описание некоторых функций и свойств класса:
IsSquare - Являится ли матрица квадратной (true - да, false - нет);
Det - детерминант (определитель) матрицы;
Join - соединяет две матрицы в строку или столбец;
напрмер: A = A.Join(B, RowOrColumn.Row) - соединить матрицу A c матрицей B в строку и записать результат в матрицу A;
GetRow - считать указанную строку в матрице;
SetRow - заполняет указанную строку матрицы вектор столбцом/строкой
например: A = A.SetRow(0, B) - заполнить первую (нулевую) строку;матрицы вектором B и записать результат в матрицу A
GetSubMatrix - вырезать под матрицу из матрицы.
1.7K
23 сентября 2006 года
alektrik
140 / / 16.01.2006
Вот полный исходник (сорри... комментариев там нет)
62K
17 июня 2010 года
joshua888
1 / / 16.06.2010
Цитата: alektrik
моё творение обратную матрицу 100х100 ищет секунд 25...


Народ, здоров. скачав цю бібліотеку, крута...
Але в мене проблема, комп висне(і не тільки мій) вже при матриці 10х10, в чому може бути проблема???

PS: а взагалі то, мені, треба 15х15, тип чисел використовую double
:confused:

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог