Компьютерный форум NoWa.cc Здесь может быть Ваша реклама
Правила Форума
редакция от 22.06.2020
Форум .::NoWa.cc::.
Вернуться   Компьютерный форум NoWa.cc > В помощь вебмастеру > Программирование > Visual C++ / С/C++

Уважаемые пользователи nowa.cc. Мы работаем для вас более 20 лет и сейчас вынуждены просить о финансовой помощи по оплате за сервер.
Окажите посильную поддержку, мы очень надеемся на вас. Реквизиты для переводов ниже.
Webmoney Webmoney WMZ: Z021474945171 Webmoney WME: E159284508897 Webmoney WMUSDT: T206853643180
Кошелёк для вашей помощи YooMoney 4100117770549562
YooMoney Спасибо за поддержку!

Ответ
 
Опции темы Опции просмотра Language
Старый 23.11.2010, 11:35   #1
Пользователь
 
Аватар для indie.
 
Пол:Мужской
Регистрация: 18.08.2010
Сообщений: 52
Репутация: 13
По умолчанию Нужно преобразовать прямоугольную матрицу в треугольную

Для преобразования использую

for (p=1; p<n; p++)
{
for (q=0; q<m; q++);
mas[p][q]=mas[p][q]*(mas[0][q]/mas[p][q])-mas[0][q];
}

По моей задумке какого размера матрица не была бы, все числа ниже основной диагонали будут нули. При выполнении программы выскакиевает ошибка "floating point root of negative number", хотя не могу понять где здесь может быть корень еще и из отрицательного числа?

Если кто-то знает другую формулу преобразования, напишите пожалуйста

Добавлено через 6 минут
хах...теперь я понял что в корне делаю неправильно, буду думать, но от помощи не откажусь
indie. вне форума
 
Ответить с цитированием Вверх
Здесь может быть Ваша реклама
Здесь может быть Ваша реклама


Реклама: SunWind SUN-M24BG110кольцо с маленьким изумрудоминтеграция метрики и вкМебельный магазин: купить в москве диван кровать - Переходи на сайт!Магазин бытовой техники: холодильник maunfeld mff50b - переходи на сайт ТАЙМТВ!


Старый 23.11.2010, 12:25   #2
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

Если нужно обнулить нижнюю часть матрицы:
Код:
for (p=0; p<n; p++)
{
    for (q=0; q<p; q++)
       mas[p][q]=0;
}
__________________
Сергей Сергеевич
zss вне форума
 
Ответить с цитированием Вверх
Старый 23.11.2010, 13:28   #3
indie.
Пользователь
 
Аватар для indie.
 
Пол:Мужской
Регистрация: 18.08.2010
Сообщений: 52
Репутация: 13
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

Спасибо за подсказку!
p.s. мне нужно использовать метод Гаусса
indie. вне форума
 
Ответить с цитированием Вверх
Старый 02.12.2010, 14:49   #4
indie.
Пользователь
 
Аватар для indie.
 
Пол:Мужской
Регистрация: 18.08.2010
Сообщений: 52
Репутация: 13
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

Написал функцию, но преобразовывается только первый столбец, хотя по идее с использованием float last эта проблема должна была решиться.

void zvedennya (float mas[n][m], int p, int q)
{
float pelem,last=0,f=0;
for (p=0; p<n; p++)
{
for (q=0; q<p; q++)
{
last=q;
pelem=mas[p][last];
for (f=q; f<m; f++)
{
mas[p][f]=mas[p][f]/pelem-mas[0][f];
}
}
}
}

Последний раз редактировалось indie.; 02.12.2010 в 15:20..
indie. вне форума
 
Ответить с цитированием Вверх
Старый 05.12.2010, 11:16   #5
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

last и f должны быть целого типа (int):
Код:
const int n=5,m=5;
void zvedennya(float mas[n][m])
{
	float pelem;
	int last=0,f=0;
	for (int p=0; p<n; p++)
	{
		for (int q=0; q<p; q++)
		{
			last=q;
			pelem=mas[p][last];
			for (f=q; f<m; f++)
			{
				mas[p][f]=mas[p][f]/pelem-mas[0][f];
			}
		}
	}
}
void main()
{
	float mm[n][m];
	for (int p=0; p<n; p++)
	{
		for (int q=0; q<m; q++)
		{
			mm[p][q]=p*q+1;
		}
	}
	zvedennya(mm);
	for (int p=0; p<n; p++)
	{
		for (int q=0; q<m; q++)
		{
			printf("%f ",mm[p][q]);
		}
		putchar('\n');
	}
        getch();
}
__________________
Сергей Сергеевич
zss вне форума
 
Ответить с цитированием Вверх
Старый 06.12.2010, 20:51   #6
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

Реализуем как в Википедии http://ru.wikipedia.org/wiki/%D0%9C%...81%D1%81%D0%B0
Код:
#include <stdio.h>
#include <conio.h>
const int n=3; // К-во строк
const int m=3; // К-во столбцов
void zvedennya(double mas[n][m])
{
	for (int p=0; p<n; p++)//номер итерации
	{
		double p0=mas[p][p]; // знаменатель
		for (int q=p+1; q<m; q++) // номер  изменяемой строки
		{
			double pelem=mas[q][p]; // числитель
			for (int f=p; f<m; f++)
			{
				mas[q][f]=mas[q][f]-mas[p][f]/p0*pelem;
			}
		}
	}
}
void main()
{
	double mm[n][m]={{2.,1.,-1.},{-3.,-1.,2.},{-2.,1.,2.}};
	zvedennya(mm);
	for (int p=0; p<n; p++)
	{
		for (int q=0; q<m; q++)
		{
			printf("%lf ",mm[p][q]);
		}
		putchar('\n');
	}
	puts("OK");
	_getch();
	return;
}
__________________
Сергей Сергеевич
zss вне форума
 
Ответить с цитированием Вверх
Старый 06.12.2010, 22:20   #7
indie.
Пользователь
 
Аватар для indie.
 
Пол:Мужской
Регистрация: 18.08.2010
Сообщений: 52
Репутация: 13
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

Спасибо, работает. Вот только 2 проблемы:
1) В очень многих случаях ошибка "Invalid floating point operation"
2) Я НИЧЕГО НЕ ПОНЯЛ

Надеюсь, что мозги есть, буду разбираться

p.s. а, и еще я обнаружил ошибку:

for (int q=p+1; q<m; q++) // номер изменяемой строки
а надо
for (int q=p+1; q<n; q++) // номер изменяемой строки

Последний раз редактировалось indie.; 07.12.2010 в 00:02..
indie. вне форума
 
Ответить с цитированием Вверх
Старый 07.12.2010, 15:17   #8
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

1.приведите пример.
2.посмотрите алгоритм в википедии. Думаю станет понятно.
3. Чтобы правильно получалось m должно быть равно n.
Иначе надо предусматривать какие-то дополнительные действия.
__________________
Сергей Сергеевич
zss вне форума
 
Ответить с цитированием Вверх
Старый 13.12.2010, 23:24   #9
indie.
Пользователь
 
Аватар для indie.
 
Пол:Мужской
Регистрация: 18.08.2010
Сообщений: 52
Репутация: 13
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

Я стараюсь сделать по своему методу, т.к. по Вашему не понял. Вот уже 15 минут смотрю в код и делаю все действия постепенно как компилятор, и все-равно программа преобразовывает в нули только первый столбец
indie. вне форума
 
Ответить с цитированием Вверх
Старый 14.12.2010, 07:24   #10
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

Еще раз смотрим в википедии
http://ru.wikipedia.org/wiki/%D0%9C%...81%D1%81%D0%B0
Там даже есть пример системы из 3 неизвестных
Цитата:
1. Обнулим коэффициенты при x во второй и третьей строчках. Для этого вычтем из них первую строчку, умноженную на -3/2 и -1 соответственно.
2. Теперь обнулим коэффициент при y в третьей строке, вычтя из неё вторую строку, умноженную на 4.

p.s. Код лучше не смотреть а скомпилировать и в отладчике пройти по шагам нажимая клавишу F10.
__________________
Сергей Сергеевич

Последний раз редактировалось zss; 14.12.2010 в 07:28..
zss вне форума
 
Ответить с цитированием Вверх
Старый 14.12.2010, 17:53   #11
indie.
Пользователь
 
Аватар для indie.
 
Пол:Мужской
Регистрация: 18.08.2010
Сообщений: 52
Репутация: 13
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

Ура! Я осилил) Спасибо, zss, за подсказку!

void zvedennya (float mas[n][m], int p, int q)
{
float pelem;
for (p=0; p<m; p++)
{
for (q=0; q<p; q++)
{
pelem=mas[p][q];
for (int i=q; i<n; i++)
{
mas[p][i]=mas[p][i]/(pelem/mas[0][i])-mas[0][i];
}
}
}
}

Тему можно закрывать
indie. вне форума
 
Ответить с цитированием Вверх
Старый 15.12.2010, 09:26   #12
zss
Постоялец
 
Пол:Мужской
Регистрация: 05.02.2007
Адрес: Москва
Сообщений: 662
Репутация: 271
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

Треугольный вид получается, но числа получаются не те, что в примере на Википедии.
И для чего Вы p,q включили в параметры функции?
Это локальные индексы циклов, и описывать их нужно локально.
Если очень хочется, то в качестве параметров перешлите n,m:
Код:
void zvedennya (double mas[NMAX][MMAX], int n, int m) 
{
    int i,p,q;
    for (p=0; p<m; p++) // номер итерации
    {
		double p0=mas[p][p]; // знаменатель, т.е. каждую строку делим на p-ый диагональный элемент
		for (q=p+1; q<m; q++) // номер  изменяемой строки
		{
			double pelem=mas[q][p]; // числитель, т.е. каждую строку домножаем на элемент (q,p)
			for (i=p; i<m; i++)
			{
				mas[q][i]=mas[q][i]-mas[p][i]/p0*pelem;
			}
		}
  }
}
NMAX>=n,MMAX>=m естественно константы, а n,m переменные.
и еще. Отчего такая жажда использования float?
Процесор все операции выполняет с точностью double
и float будет полезным только если катастрофически не хватает
оперативной памяти.
__________________
Сергей Сергеевич

Последний раз редактировалось zss; 15.12.2010 в 18:47..
zss вне форума
 
Ответить с цитированием Вверх
Старый 19.12.2010, 00:48   #13
indie.
Пользователь
 
Аватар для indie.
 
Пол:Мужской
Регистрация: 18.08.2010
Сообщений: 52
Репутация: 13
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

p,q это типо деффект. а изменять мне лень
а числа и правда не те...

а в вашем коде мне еще предстоит разобраться. он то работает (спасибо!), но это не главное. может я не могу его разобрать из-за того что сейчас температура 38. завтра с утреца еще раз гляну.
indie. вне форума
 
Ответить с цитированием Вверх
Старый 19.12.2010, 22:00   #14
indie.
Пользователь
 
Аватар для indie.
 
Пол:Мужской
Регистрация: 18.08.2010
Сообщений: 52
Репутация: 13
По умолчанию Re: Нужно преобразовать прямоугольную матрицу в треугольную

более-менее разобрался спасибо!
indie. вне форума
 
Ответить с цитированием Вверх
Ответ


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбила матрицу :( domokozyavka Скорая помощь 7 26.08.2010 19:04
Чем преобразовать Coroconogka Macromedia Flash 3 03.07.2008 00:15
NEC создаёт ультрабыструю LCD-матрицу StreLock Новости железа 2 10.05.2006 22:11
SWF - преобразовать gavan Macromedia Flash 3 08.05.2006 02:51

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 17:11. Часовой пояс GMT +3.


Copyright ©2004 - 2026 NoWa.cc

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2026, vBulletin Solutions, Inc. Перевод: zCarot
Время генерации страницы 0.06514 секунды с 11 запросами