Регистрирайте сеРегистрирайте се

Една конкретна матрица


 
   Форум за математика Форуми -> Kомпютърни изчисления
Предишната тема :: Следващата тема  
Автор Съобщение
xyz
Напреднал


Регистриран на: 20 May 2007
Мнения: 319

Репутация: 41.2Репутация: 41.2Репутация: 41.2Репутация: 41.2
гласове: 12

МнениеПуснато на: Sat Oct 20, 2007 11:25 am    Заглавие: Една конкретна матрица

Някой ще може ли да ми изчисли детеримантата на матрицата:
Код:

  0  0  0  0  0 -1  0  0  0  0  0  0  0  0  0  0  0  0 -1 +1  0  0  0  0
 +1  0  0  0  0 -1  0  0  0  0  0  0  0  0  0  0  0  0  0 +1  0  0  0  0
  0 +1  0  0  0 -1  0  0  0  0  0  0  0  0  0  0  0  0  0 +1  0  0  0 -1
  0  0 +1  0  0 -1  0  0  0  0  0  0  0  0  0  0  0  0  0 +1  0  0 -1  0
  0  0  0 +1  0 -1  0  0  0  0  0  0  0  0  0  0  0  0  0 +1  0 -1  0  0
  0  0  0  0 +1  0  0  0  0  0  0  0  0  0  0  0  0  0  0 +1 -1  0  0  0
 +1 -1  0  0  0  0  0  0  0  0  0 -1  0  0  0  0  0  0 -1 +1  0  0  0  0
  0 -1  0  0  0  0 +1  0  0  0  0 -1  0  0  0  0  0  0  0 +1  0  0  0  0
  0 -1  0  0  0 +1  0 +1  0  0  0 -1  0  0  0  0  0  0  0 +1  0  0  0 -1
  0 -1  0  0 +1  0  0  0 +1  0  0 -1  0  0  0  0  0  0  0 +1  0  0 -1  0
  0 -1  0 +1  0  0  0  0  0 +1  0 -1  0  0  0  0  0  0  0 +1  0 -1  0  0
  0 -1 +1  0  0  0  0  0  0  0 +1  0  0  0  0  0  0  0  0 +1 -1  0  0  0
  0  0  0  0  0  0 +1 -1  0  0  0  0  0  0  0  0  0 -1 -1 +1  0  0  0  0
  0  0  0  0  0  0  0 -1  0  0  0  0 +1  0  0  0  0 -1  0 +1  0  0  0  0
  0  0  0  0  0  0  0 -1  0  0  0 +1  0 +1  0  0  0 -1  0 +1  0  0  0 -1
  0  0  0  0  0  0  0 -1  0  0 +1  0  0  0 +1  0  0 -1  0 +1  0  0 -1  0
  0  0  0  0  0  0  0 -1  0 +1  0  0  0  0  0 +1  0 -1  0 +1  0 -1  0  0
  0  0  0  0  0  0  0 -1 +1  0  0  0  0  0  0  0 +1  0  0 +1 -1  0  0  0
  0  0  0  0  0  0  0  0  0  0  0  0 +1 -1  0  0  0  0  0 +1  0  0  0 -1
  0  0  0  0  0  0  0  0  0  0  0  0  0 -1  0  0  0  0 +1  0  0  0  0 -1
  0  0  0  0  0  0  0  0  0  0  0  0  0 -1  0  0  0 +1  0 +2  0  0  0 -2
  0  0  0  0  0  0  0  0  0  0  0  0  0 -1  0  0 +1  0  0 +1 +1  0 -1 -1
  0  0  0  0  0  0  0  0  0  0  0  0  0 -1  0 +1  0  0  0 +1  0  0  0 -1
  0  0  0  0  0  0  0  0  0  0  0  0  0 -1 +1  0  0  0  0 +1 -1  0 +1  0
,
че не притежавам подходящ софтуер за момента.
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Реклама







Пуснато на:     Заглавие: Реклама

Върнете се в началото
Irrefutable
Напреднал


Регистриран на: 15 Jul 2007
Мнения: 298
Местожителство: София
Репутация: 28.8Репутация: 28.8Репутация: 28.8
гласове: 5

МнениеПуснато на: Sat Oct 20, 2007 12:52 pm    Заглавие:

125 , С програма която написах, мисля че няма грешка , сега ще допроверя с тестове с който съм сигурен.

Код:
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int det( vector<vector<int> > M)
{
   
    int ret = 0;
    if (M.size() == 2)
    {       
       return M[0][0] * M[1][1] - M[0][1]*M[1][0];
    }
    else
    {
        vector<vector<int> > MN = M;
       
        for(int i = 0 ; i < MN.size() ; i++)
                MN[i].erase( MN[i].begin() , MN[i].begin() + 1); 
       
        for(int i = 0 ; i < M.size() ; i++)
        {
            if( M[i][0] !=0 )
            {
                vector<vector<int> >  MNN = MN;
               
                MNN.erase( MNN.begin() + i , MNN.begin() + i + 1);
                int znak = i%2 ? -1:1;
                ret+=M[i][0] * det(MNN) * znak ;
            }
           
        }
       
        return ret;
    }
};

int main()
{
    vector<vector<int> >  matrix;
    ifstream ifs("det.txt");
   
    int N = 24 ;
   
    for(int i = 0 ; i < N ; i ++)
    {
            vector<int> row(N,0);
           
            for(int z = 0 ; z <N ; z++)
                    ifs>>row[z];
                   
            matrix.push_back(row);
    };
   
    cout<<det(matrix);
   
    cin.get();
    return 0;
}
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Irrefutable
Напреднал


Регистриран на: 15 Jul 2007
Мнения: 298
Местожителство: София
Репутация: 28.8Репутация: 28.8Репутация: 28.8
гласове: 5

МнениеПуснато на: Sat Oct 20, 2007 12:57 pm    Заглавие:

Дам, поне задачите от сборника ги смята вярно.
Жалко че не е много практична и за матрици с повече ненулеви числа ще работи изключително бавно.
Ще взема да поразвия програмката да изважда и събира редове за да оптимизира матрицата. Но няма да е сега Wink
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
Irrefutable
Напреднал


Регистриран на: 15 Jul 2007
Мнения: 298
Местожителство: София
Репутация: 28.8Репутация: 28.8Репутация: 28.8
гласове: 5

МнениеПуснато на: Sun Oct 21, 2007 9:06 am    Заглавие:

Опа , ето новата ми програмка. Доста по-бърза от старата. Правя матрицата триъгълна и смятам диагонала , сложността стана О(n^3). И за сега по-добро решение не измислям. Поне вече може да се спарвя с всякакви числа в матрицата не е като предишната с О(n^n) Wink
Код:
double det( vector<vector<double> > M)
{
    int n = M.size();
    double det = 1;
   
    for(int i = 0 ; i < n;i++)
    {
            if ( M[i][i] == 0 )
            {
                 int have=false;
                 for ( int t = i+1 ; t < n ; t )
                 {
                     if (M[t][i] != 0 )
                     {
                        have = true;
                        swap(M[t],M[i]);
                        break;
                     }
                 }
                 if(have == false)
                         return 0;
            }
           
            det*=M[i][i];
           
            for(int z=i+1; z<n;z++)           
            {
                   
                    double co = M[z][i] / M[i][i];                   
                    for(int q = i ; q<n ; q++)
 
                            M[z][q] -= M[i][q] * co;
                                       
            }
    }
    return det;
};
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
steliyan
Редовен


Регистриран на: 25 Oct 2006
Мнения: 100

Репутация: 22.2Репутация: 22.2
гласове: 2

МнениеПуснато на: Mon Oct 22, 2007 5:17 pm    Заглавие:

Не съм много наясно с детерминантите, да не кажа, че никога не съм решавал, но мисля, че има няколко проблема във функцията ти. Wink
Код:
int have=false;

Може би трябва да е:
Код:
bool have=false;


И този цикъл:
Код:

if ( M[i][i] == 0 )
{
     int have=false;
     for ( int t = i+1 ; t < n ; t )
     {
         if (M[t][i] != 0 )
         {
            have = true;
            swap(M[t],M[i]);
            break;
         }
     }
     if(have == false)
             return 0;
}


Не може ли да стане така?
Код:
if(M[i][i] == 0)
{
     bool have=false;


         if (M[i+1][i] != 0 && have == true)
         {
            have = true;
            swap(M[i+1],M[i]);
         }
       else
             return 0;
}
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Irrefutable
Напреднал


Регистриран на: 15 Jul 2007
Мнения: 298
Местожителство: София
Репутация: 28.8Репутация: 28.8Репутация: 28.8
гласове: 5

МнениеПуснато на: Mon Oct 22, 2007 10:22 pm    Заглавие:

Първо по повод инт и боол , Да прав си , може да спестиме 3 байта , грешката е чисто техническа , напрактика кода работи перфектно и така защото false e 0 a true e 1 , и това са просто едни #define-ни Wink Щеше да бачка и ако бях написал вместо int , float , double , char , long long....

По втория , цикъла е t++ , при копирането нещо се е омазало (я съм цъкнал някъде бекспейс без да видя , я макстъна пак е здал)...... От там нататъка ти е ясно каква е идеята и защо не може да се напише по твоя начин. Wink
Това което прави онази част от кода е ако първия ( първия който ни интересува , съответно к-тата колона )елемента от съответния ред с който работим е 0 , намираме друг ред , по-долен от този , за който съответния елемент не е нула.
Ако всичките са нули , то детерминантата е нула. Ако не , ги разменяме 2-та реда.
Съответно, не може да се замени само с проверка на следващия ред.

Още повече че това което си написал:
Код:
if(M[i][i] == 0)
{
     bool have=false;
         if (M[i+1][i] != 0 && have == true)

Сам се досещаш че в ифа няма да се влезе никога , тъй като have го иницялизираш с false и няма начин да се промени докато стигне до сегмента Wink
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение Посетете сайта на потребителя
steliyan
Редовен


Регистриран на: 25 Oct 2006
Мнения: 100

Репутация: 22.2Репутация: 22.2
гласове: 2

МнениеПуснато на: Tue Oct 23, 2007 8:50 pm    Заглавие:

Мда, разбрах те. Wink
Върнете се в началото
Вижте профила на потребителя Изпратете лично съобщение
Покажи мнения от преди:   
   Форум за математика Форуми -> Kомпютърни изчисления Часовете са според зоната GMT + 2 Часа
Страница 1 от 1

 
Идете на:  
Не Можете да пускате нови теми
Не Можете да отговаряте на темите
Не Можете да променяте съобщенията си
Не Можете да изтривате съобщенията си
Не Можете да гласувате в анкети
You cannot attach files in this forum
Може да сваляте файлове от този форум
Copyright © 2005-2021 math10.com.