![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Ares |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 14.3.2005 Репутация: нет Всего: нет |
У меня есть компонент StringGrid, используемый в роли матрицы, мне нужно вычислить определьтель этой матрицы! Дайте советы как это сделать!
|
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
вот тебе не большой пример, правда для 3х мерной матрици, но его можно изменить как те надо
|
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Для хранения матрицы использован класс, в которм переопределена операция лоступа (). Можно заменить на массив или твой элемент StringGrid при желании.... |
|||
|
||||
| Void |
|
||||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
DENNN
Честно говоря, не очень врубился в логику кода, по по-моему здесь используется привычный "ручной" алгоритм вычисления определителя. И скорость у него, равно как и использование памяти не очень хорошие. Если матрицу можно модифицировать, то могу предложить такой вариант: приводим ее к треугольной, а потом вычисляем определитель просто перемножив элементы главной диагонали. Вот код, особо не проверял, но вроде работает. При необходимости легко адаптируется под любой 2D-контейнер:
P.S.
Процесс изменения для матрицы 16x16 в студию, пожалуйста -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
||||
|
|||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Именно так. Простейший способ из учебника. Насчет расхода памяти согласен (процедура ведь рекурсивная), а вот быстродействие - зависит с какой реализацией сравнивать. В этом коде нет операций деления и перестановок, есть только умножения, сложения и доступа к памяти. Добавлено @ 08:40 P.S. Вообще очень рекомендую для работы с матрицами бибилиотеку newmat. Правда в последней версии она капризничает к типам данных при подсчете поиске матрицы, потому, собственно, этот алгоритм и набросал на скорую руку. |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
И все же только в теле процедуры, без учета рекурсии, я вижу O(N^3). Значит на самом деле будет существенно хуже. По-моему, даже не полиномиальная зависимость, а что-то порядка N!. У меня же O(N^3) без всяких оговорок. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
|
|||
|
||||
| Helicopter |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 22.7.2005 Репутация: нет Всего: нет |
А я как-то ради прикола написал прогу для расчёта определителя
матрицы по теореме старика Лапласа. Вручную это полный заё... Матрица 4х4, интересно то, что помогли квадратные уравнения. Текст Laplas.cpp: #include <iostream> #include <stdlib> #include <math> #define PR cout<< #include <John> short main(void) {short deti; PR " Hello body!\n\n Matrix:\n"; PR John(deti); return 0;} Текст John.h: short John (short deti) { short string1=0, string2=0, help1=0,det=0, help2=0, C=0,B=0, scherta1=0, scherta2=0, hcherta1=0, hcherta2=0, D=0, helpt2=0, helpt1=0, A[4][4], H[]={5,3,1,5,6,1,3,3,0,2,0,1,4,1,1,2}; for (help1=0; help1<=3; help1++) {cout<< "\n"; for (help2=0; help2<=3;help2++) {A[help1][help2]=H[help2+help1*4]; PR A[help1][help2]<<" "; }} PR"\n\n Number first worker line "; cin>>string1; PR"\n Number second worker line "; cin>>string2; if(string1<1||string1>4||string1==string2||string2<1||string2>4||string1>string2){PR "Invalid parameters are Incorporated"; exit(1);} C=24/(string1*string2); B=10-(string1+string2); D=abs(B*B-4*C); D=sqrt(D); help1=abs((B-D)/2); help2=abs((B+D)/2); scherta2=(help1>help2)?help1:help2; scherta1=(help1+help2)-scherta2; for(help1=1;help1<5;help1++){ for(help2=2;help2<5;help2++){ if(help2<=help1) continue; C=24/(help1*help2); B=10-(help1+help2); D=abs(B*B-4*C); D=sqrt(D); helpt1=abs((B-D)/2); helpt2=abs((B+D)/2); hcherta2=(helpt1>helpt2)?helpt1:helpt2; hcherta1=(helpt1+helpt2)-hcherta2; det=det+(((A[string1-1][help1-1]*A[string2-1][help2-1]-A[string1-1][help2-1]* A[string2-1][help1-1])*(A[scherta1-1][hcherta1-1]* A[scherta2-1][hcherta2-1]-A[scherta1-1][hcherta2-1]* A[scherta2-1][hcherta1-1]))*pow((-1),(string1+string2+help1+help2)));}} PR"\n\tDeterminante of your matrix = "; deti=det; return deti+0; } |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |