Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.10.2010, 20:59   #1
lecume
Пользователь
 
Аватар для lecume
 
Регистрация: 17.12.2009
Сообщений: 11
Лампочка Обратная неквадратная матрица, ayudame por favor! )

Всем добрый вечер!
Ребят, может у кого-то был опыт нахождения обратной матрицы для имеющейся неквадратной? Для квадратной код есть, все работает. Могу выложить, но, думаю, для неквадратной подход совсем другой.
Подскажите, пожалуйста!

Код:
int gaus_ostatok; // дефект линейного преобразования
float gaus_deter; //  в случае успешного обращения детерминант
float gaus_minved; //  минимальный ведущий элемент, можно использовать для оценки точности

#define _NaN() (float&)*"Implementation dependent"; // заполнитель для неразрешенных измерений //  при невозможности обращения

inline static  void  invers(float m[100][100], int N)
   {
     int rn[100], cn[100];
     int j, k;
     for(j = N; j--; )  rn[j] = cn[j] = j;
     gaus_minved = 1e99;
     gaus_deter = 1;
     for (gaus_ostatok = N; gaus_ostatok; gaus_ostatok--)
     {  
		 int jved, kved;
		 float vved = -1,t; // поиск ведущего
		 for (j = N; j--; )
		 {  
			if(~rn[j])
			for (k = N; k--;)
			  if(~cn[k])
			  if(vved < fabs(m[j][k]))  vved = fabs(m[j][k]), jved = j, kved = k;
		 }        
		 if(gaus_minved > vved)  gaus_minved = vved;
		 gaus_deter*=m[jved][kved];
		 if(vved < 1e-99)
		 {  
			for (j = N; j--; )
			{  
				if(~rn[j]) for (k = N; k--; ) m[j][k] = _NaN();
				if(~cn[j]) for(k = N; k--; ) m[k][j] = _NaN();
			}
		 return;
		 }
        int jt = rn[jved], kt = cn[kved];  // перестановки
        for (j = N; j--; )  t = m[kt][j], m[kt][j] = m[jved][j], m[jved][j] = t;
        for (j = N; j--; )  t = m[j][jt], m[j][jt] = m[j][kved], m[j][kved] = t;
        rn[jved] = rn[kt];
        cn[kved] = cn[jt];
        rn[kt] = cn[jt] = -1;
        vved = m[kt][jt];  
	    m[kt][jt] = 1;
        for (j=N;j--;)
        {  
		   if(j == kt)  continue;
// if (fabs (vved) < FLT_EPSILON) {}
           float mul = m[j][jt] / vved;
           m[j][jt] = 0;
           for (k = N; k--; ) m[j][k] -= m[kt][k] * mul; // самый внутренний цикл ровно N^3 операций
        }
        for (k = N; k--; ) m[kt][k] /= vved;
     }
   }

Последний раз редактировалось Stilet; 25.10.2010 в 13:20.
lecume вне форума Ответить с цитированием
Старый 24.10.2010, 21:17   #2
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

Посмотрите функцию ReverseMatrix(MPtr : MatrixPtr) : MatrixPtr;
в теме: http://www.programmersforum.ru/showt...t=70310&page=3
посты #25 - #28.
Там, правда на Паскале, но если с ним знакомы - переведете на Си.
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab
ex.cluz вне форума Ответить с цитированием
Старый 25.10.2010, 11:58   #3
lecume
Пользователь
 
Аватар для lecume
 
Регистрация: 17.12.2009
Сообщений: 11
По умолчанию

Спасибо большое! Я поиском, честно, пользовалась
С Паскалем незнакома совершенно. Для знающего человека много времени займет перевести это на Си/С++?
P. S. С не квадратными матрицами модуль хорошо работает?
lecume вне форума Ответить с цитированием
Старый 25.10.2010, 13:08   #4
ex.cluz
Участник клуба
 
Аватар для ex.cluz
 
Регистрация: 15.01.2010
Сообщений: 1,325
По умолчанию

Я на нем прогу по стат.анализу делал (реализовывал метод множественной линейной регрессии для обработки данных, а там, если мне не изменяет память, обращение идет произведения матриц, а при произведении получается квадратная).

А вообще, кто теорию читать будет?

Для неквадратных матриц и вырожденных матриц обратных матриц не существует.
Грибы - они разные. Один тебя накормит, другой тебе кино покажет...
Редактор журнала "
[ПРОграммист]"
Yan's Home Digital Lab
ex.cluz вне форума Ответить с цитированием
Старый 25.10.2010, 14:08   #5
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от ex.cluz Посмотреть сообщение
А вообще, кто теорию читать будет?
Очень верное замечание!

Цитата:
Сообщение от ex.cluz
Для неквадратных матриц и вырожденных матриц обратных матриц не существует.
Для неквадратных матриц, при выполнении определённых условий, существуют понятия левой [псевдо-]обратной (left [pseudo-]inverse ) и правой [псевдо-]обратной (right [pseudo-]inverse) матрицы. Метод Мура-Пенроуза (Moore-Penrose method) это...
Vago вне форума Ответить с цитированием
Старый 25.10.2010, 14:22   #6
lecume
Пользователь
 
Аватар для lecume
 
Регистрация: 17.12.2009
Сообщений: 11
По умолчанию

Точно-точно! Простите, 2-ой курс был давно
А программа эта все равно пригодится.
lecume вне форума Ответить с цитированием
Старый 25.10.2010, 14:47   #7
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Armadillo.
A pesar de su título Español, todo es en idioma Inglés
Vago вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
обратная матрица LastBreath Помощь студентам 1 04.06.2010 20:30
Обратная матрица Шахрия Помощь студентам 1 26.10.2009 17:28
Обратная матрица Nox_uf Помощь студентам 1 23.09.2009 16:11
Обратная матрица Artemm Общие вопросы C/C++ 6 26.05.2009 17:55
обратная матрица=) PrincEssa91 Паскаль, Turbo Pascal, PascalABC.NET 0 23.05.2009 15:59