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);
}
}
Обратная матрица
пробовал Гаусса, в принципе получилось, но на матрице:
1 2 2
4 8 6
7 8 9
алгоритм взял и загнулся
P.S. метод с помощью алгебраических дополнений не годится...
решение
да и в полезных ссылках раздел студенты есть линки на алгоритмы ...
[COLOR=red]кросспостинг запрещен, читай правила форума[/COLOR]
на форуме вроде уже есть
да и в полезных ссылках раздел студенты есть линки на алгоритмы ...
[COLOR=red]кросспостинг запрещен, читай правила форума[/COLOR]
Цитата:
пробовал Гаусса, в принципе получилось, но на матрице:
1 2 2
4 8 6
7 8 9
алгоритм взял и загнулся
1 2 2
4 8 6
7 8 9
алгоритм взял и загнулся
загнулся видимо потому что ты не сделал проверки на значение пивота(не знаю как это по русски, надеюсь ты меня понял). во второй итерации пивот попадает на ноль, поэтому 2 и 3 строки матрицы (1 и 2, если индексация с нуля) надо поменять. т.е. проверки надо добавить + функцию которая меняет строки.
не понял, что такое пивот... но знал, что там (во второй строке) получается нечто [0 0 x]... отсюда и глюк, а вот на счет перестановки не догадался... но всё равно хотелось бы алгоритм какой-нть пооптимизорованней, а то моё творение обратную матрицу 100х100 ищет секунд 25... а вот например взять Matlab - доли секунды и вуаля результ...
а насчет перестановок строк - это прием из математики, также если хоть одна строка в матрице А для который ищем обратную матрицу обнуляется, тогда у неё нет обратной матрицы.
з.ы. если понял что такое пивот, скажи плиз как это по русски.
ну в принципе перестановок апмалютна согласен из серии - если в системе уравнений уравнения переставить местами смысл не измениться... thanks за мыслю... вот думаю, если выкину сюда свою прогу на C# это будет нормально??? или лучше в раздел .NET Framework с темой типа "Помогите оптимизировать"??? как думаешь(-те) куда правильней будет???
если код большой пользуйся вложениями.
Код:
Описание некоторых функций и свойств класса:
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 - вырезать под матрицу из матрицы.
Вот полный исходник (сорри... комментариев там нет)
Цитата: alektrik
моё творение обратную матрицу 100х100 ищет секунд 25...
Народ, здоров. скачав цю бібліотеку, крута...
Але в мене проблема, комп висне(і не тільки мій) вже при матриці 10х10, в чому може бути проблема???
PS: а взагалі то, мені, треба 15х15, тип чисел використовую double
:confused: