Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определитель матриц! 
:(
    Опции темы
Ares
Дата 6.7.2005, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 14.3.2005

Репутация: нет
Всего: нет



У меня есть компонент StringGrid, используемый в роли матрицы, мне нужно вычислить определьтель этой матрицы! Дайте советы как это сделать!
PM MAIL   Вверх
chaos
Дата 6.7.2005, 06:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



вот тебе не большой пример, правда для 3х мерной матрици, но его можно изменить как те надо

Код


class Matrix3D
{
public:
    float x [3][3];

    Matrix3D () {}

    float det () const;
};


float    Matrix3D :: det () const
{
    return x [0][0]*(x [1][1]*x [2][2]-x [1][2]*x [2][1]) -
           x [0][1]*(x [1][0]*x [2][2]-x [1][2]*x [2][0]) +
           x [0][2]*(x [1][0]*x [2][1]-x [1][1]*x [2][0]);
}

PM WWW   Вверх
DENNN
Дата 6.7.2005, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Код

double determinant(Matrix& a)
{
    int n=a.Ncols();
    int i,j,k;
    double s;

    if (n!=a.Nrows())
        return 0.0;
    if (1==n)
        return a(1,1);

    Matrix b(n-1,n-1);
    s=0.0;
    for (i=1;i<=n;i++)
    {
        for (j=2;j<=n;j++)//используем первую строку
        {
            for (k=1;k<=n;k++)
            {
                if (k==i)
                    continue;
                b(j-1,k<i ? k : k-1)=a(j,k);
            }
        }
        s+=a(1,i)*( (i+1)%2>0 ? -1 : 1)*determinant(b);
    }
    return s;
}

Для хранения матрицы использован класс, в которм переопределена операция лоступа (). Можно заменить на массив или твой элемент StringGrid при желании....
PM ICQ   Вверх
Void
Дата 6.7.2005, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



DENNN
Честно говоря, не очень врубился в логику кода, по по-моему здесь используется привычный "ручной" алгоритм вычисления определителя. И скорость у него, равно как и использование памяти не очень хорошие.

Если матрицу можно модифицировать, то могу предложить такой вариант: приводим ее к треугольной, а потом вычисляем определитель просто перемножив элементы главной диагонали. Вот код, особо не проверял, но вроде работает. При необходимости легко адаптируется под любой 2D-контейнер:
Код

double det(double **m, size_t n) {
    size_t i, j, k;
    double a, d = 1;
    for (i = 0; i < n - 1; ++i)
        for (j = i + 1; j < n; ++j) {
            if (m[i][i] == 0) return 0;
            a = m[j][i] / m[i][i];
            for (k = i; k < n; ++k)
                m[j][k] -= m[i][k] * a;
        }
    for (i = 0; i < n; ++i)
        d *= m[i][i];
    return d;
}


P.S.
Цитата(chaos @ 6.7.2005, 08:07)
вот тебе не большой пример, правда для 3х мерной матрици, но его можно изменить как те надо

Процесс изменения для матрицы 16x16 в студию, пожалуйста smile


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
DENNN
Дата 7.7.2005, 08:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



Цитата(Void @ 6.7.2005, 20:17)
естно говоря, не очень врубился в логику кода, по по-моему здесь используется привычный "ручной" алгоритм вычисления определителя. И скорость у него, равно как и использование памяти не очень хорошие.

Именно так. Простейший способ из учебника. Насчет расхода памяти согласен (процедура ведь рекурсивная), а вот быстродействие - зависит с какой реализацией сравнивать. В этом коде нет операций деления и перестановок, есть только умножения, сложения и доступа к памяти.
Добавлено @ 08:40
P.S. Вообще очень рекомендую для работы с матрицами бибилиотеку newmat. Правда в последней версии она капризничает к типам данных при подсчете поиске матрицы, потому, собственно, этот алгоритм и набросал на скорую руку.
PM ICQ   Вверх
Void
Дата 7.7.2005, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(DENNN @ 7.7.2005, 10:38)
Именно так. Простейший способ из учебника. Насчет расхода памяти согласен (процедура ведь рекурсивная), а вот быстродействие - зависит с какой реализацией сравнивать. В этом коде нет операций деления и перестановок, есть только умножения, сложения и доступа к памяти.

И все же только в теле процедуры, без учета рекурсии, я вижу O(N^3). Значит на самом деле будет существенно хуже. По-моему, даже не полиномиальная зависимость, а что-то порядка N!. У меня же O(N^3) без всяких оговорок.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
DENNN
Дата 7.7.2005, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 3878
Регистрация: 27.3.2002
Где: Москва

Репутация: 1
Всего: 43



smile я и не претендую на лучшее решение.
PM ICQ   Вверх
Helicopter
  Дата 25.7.2005, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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; }


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0510 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.