Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Алгоритм вычисления определителя...


Автор: GaGu 19.1.2008, 16:49
Доброе время суток, господа!
Обращаюсь к вам со следующим вопросом: как на С++ можно реализовать алгоритм вычисления определителя произвольной матрицы NxN, причём сначала программа спрашивает размерность матрицы(то есть N), затем предлагает её заполнить, и уже после этого выводит результат(т.е значение определителя). Прошу хотя бы намекнуть, лучше конечно было бы показать код smile . 
И ещё, есть ли стандартные библиотечные функции для работы с матрицами? Если да, то какие?
Всем заранее спасибо, с уважением GaGu! smile 

Автор: JackYF 19.1.2008, 17:00
Цитата(GaGu @  19.1.2008,  15:49 Найти цитируемый пост)
как на С++ можно реализовать алгоритм вычисления определителя произвольной матрицы NxN

рекурсивно, к примеру. Определитель матрицы N x N определяется через N определителей матриц N-1 x N-1.

Автор: archimed7592 19.1.2008, 17:08
Цитата(GaGu @  19.1.2008,  16:49 Найти цитируемый пост)
как на С++ можно реализовать алгоритм

Перед тем как реализовывать нужно придумать(или уже знать) сам алгоритм.

1. Считать с клавиатуры N.
2. http://forum.vingrad.ru/index.php?show_type=forum&showtopic=189118&kw=%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9-%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2-array-vector-faq&show_topics_from_subforums=&st=0.
3. Посчитать детерминант по твоему алгоритму.
4. Вывести результат.

Какие конкретно пункты из перечисленных вызывают затруднения?

Автор: MAKCim 19.1.2008, 18:01
Цитата(JackYF @  19.1.2008,  17:00 Найти цитируемый пост)
рекурсивно, к примеру. Определитель матрицы N x N определяется через N определителей матриц N-1 x N-1. 

плохо
GaGu
LU-разложение
http://alglib.sources.ru/matrixops/general/det.php

Автор: Treod 19.1.2008, 20:57

Метод Гаусса:
Код

#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
    double *a, k, r, max;
    int i, j ,q, n, j_max;

    cout << "Input n: ";
    cin >> n;
    a=new double [n*n];
    for (i=0; i<n; i++){
        for (j=0; j<n; j++){
            cout << "Input a[" << i << "][" << j << "]=";
            cin >> a[i*n+j];
        }
    }
    for (i=0; i<n; i++){
        for (j=0; j<n; j++)
            cout << a[i*n+j] << " ";
        cout << endl;
    }

    for (i=0; i<n-1; i++){
        // Ищем максимальный по 
        // модулю элемент в столбце
        max=a[i*n+i];
        j_max=i;
        for (j=i+1; j<n; j++){
            if (fabs(a[j*n+i])>fabs(max)){
                max=a[j*n+i];
                j_max=j;
            }
        }
        // Меняем строки местами
        if (j_max!=i){
            for (j=0; j<n; j++){
                r=a[j_max*n+j];
                a[j_max*n+j]=a[i*n+j];
                a[i*n+j]=-r;
            }
        }
        /*
        Если элемент главной диагонали не равен нулю,
        используя элементарные преобразования,
        обнуляем все элементы j-ого столбца,
        начиная с i+1 элемента.
        */
        if (a[i*n+i]!=0){
            for (j=i+1; j<n; j++){
                k=a[j*n+i]/a[i*n+i];
                for (q=i; q<n; q++)
                    a[j*n+q]-=k*a[i*n+q];
            }
        }
        else{
            cout << "Net resh!";
            return 0;
        }
    }
    if (a[(n-1)*n+(n-1)]==0){
        cout << "Net resh!";
        return 0;
    }

    k=1;
    for (i=0; i<n; i++)
        k=k*a[i*n+i];
    cout << endl;
    cout << "det= " << k << endl;

    delete [] a;
    cin >> i;
    return 0;

Автор: GaGu 19.1.2008, 21:59
Спасибо за код, очень помогло. Я вот только в С++ не очень то и гуру, поэтому хочу спросить: что за функция fabs()? И ещё, может кто знает, где можно доку достать по функциям, содержащимся в <math.h>?
Заранее спасибо.

Автор: JackYF 19.1.2008, 22:13
Цитата(GaGu @  19.1.2008,  20:59 Найти цитируемый пост)
то за функция fabs()

документация рулит. Прочитай.


Цитата(GaGu @  19.1.2008,  20:59 Найти цитируемый пост)
И ещё, может кто знает, где можно доку достать по функциям, содержащимся в <math.h>

cppreference.com

Автор: DigitSphinx 19.1.2008, 22:16
Цитата(GaGu @  19.1.2008,  21:59 Найти цитируемый пост)
И ещё, может кто знает, где можно доку достать по функциям, содержащимся в <math.h>?

Google.com
MSDN

Автор: Treod 21.1.2008, 12:34

Цитата

что за функция fabs()

fabs() - абсолютное значение числа;)

Автор: SimpAlex 22.7.2008, 15:41
ygujyg

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)