| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Определитель матриц! |
| Автор: Ares 6.7.2005, 05:17 |
| У меня есть компонент StringGrid, используемый в роли матрицы, мне нужно вычислить определьтель этой матрицы! Дайте советы как это сделать! |
| Автор: chaos 6.7.2005, 06:07 | ||
вот тебе не большой пример, правда для 3х мерной матрици, но его можно изменить как те надо
|
| Автор: DENNN 6.7.2005, 12:47 | ||
Для хранения матрицы использован класс, в которм переопределена операция лоступа (). Можно заменить на массив или твой элемент StringGrid при желании.... |
| Автор: Void 6.7.2005, 20:17 | ||||
| DENNN Честно говоря, не очень врубился в логику кода, по по-моему здесь используется привычный "ручной" алгоритм вычисления определителя. И скорость у него, равно как и использование памяти не очень хорошие. Если матрицу можно модифицировать, то могу предложить такой вариант: приводим ее к треугольной, а потом вычисляем определитель просто перемножив элементы главной диагонали. Вот код, особо не проверял, но вроде работает. При необходимости легко адаптируется под любой 2D-контейнер:
P.S.
Процесс изменения для матрицы 16x16 в студию, пожалуйста |
| Автор: DENNN 7.7.2005, 08:38 | ||
Именно так. Простейший способ из учебника. Насчет расхода памяти согласен (процедура ведь рекурсивная), а вот быстродействие - зависит с какой реализацией сравнивать. В этом коде нет операций деления и перестановок, есть только умножения, сложения и доступа к памяти. Добавлено @ 08:40 P.S. Вообще очень рекомендую для работы с матрицами бибилиотеку newmat. Правда в последней версии она капризничает к типам данных при подсчете поиске матрицы, потому, собственно, этот алгоритм и набросал на скорую руку. |
| Автор: Void 7.7.2005, 20:35 | ||
И все же только в теле процедуры, без учета рекурсии, я вижу O(N^3). Значит на самом деле будет существенно хуже. По-моему, даже не полиномиальная зависимость, а что-то порядка N!. У меня же O(N^3) без всяких оговорок. |
| Автор: DENNN 7.7.2005, 22:12 |
| |
| Автор: Helicopter 25.7.2005, 22:01 |
| А я как-то ради прикола написал прогу для расчёта определителя матрицы по теореме старика Лапласа. Вручную это полный заё... Матрица 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; } |