Регистрирайте се
| Предишната тема :: Следващата тема |
| Автор |
Съобщение |
xyz Напреднал
Регистриран на: 20 May 2007 Мнения: 319
     гласове: 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 Местожителство: София
    гласове: 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 Местожителство: София
    гласове: 5
|
Пуснато на: Sat Oct 20, 2007 12:57 pm Заглавие: |
|
|
Дам, поне задачите от сборника ги смята вярно.
Жалко че не е много практична и за матрици с повече ненулеви числа ще работи изключително бавно.
Ще взема да поразвия програмката да изважда и събира редове за да оптимизира матрицата. Но няма да е сега  |
|
| Върнете се в началото |
|
 |
Irrefutable Напреднал

Регистриран на: 15 Jul 2007 Мнения: 298 Местожителство: София
    гласове: 5
|
Пуснато на: Sun Oct 21, 2007 9:06 am Заглавие: |
|
|
Опа , ето новата ми програмка. Доста по-бърза от старата. Правя матрицата триъгълна и смятам диагонала , сложността стана О(n^3). И за сега по-добро решение не измислям. Поне вече може да се спарвя с всякакви числа в матрицата не е като предишната с О(n^n)
| Код: | 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
   гласове: 2
|
Пуснато на: Mon Oct 22, 2007 5:17 pm Заглавие: |
|
|
Не съм много наясно с детерминантите, да не кажа, че никога не съм решавал, но мисля, че има няколко проблема във функцията ти.
Може би трябва да е:
И този цикъл:
| Код: |
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 Местожителство: София
    гласове: 5
|
Пуснато на: Mon Oct 22, 2007 10:22 pm Заглавие: |
|
|
Първо по повод инт и боол , Да прав си , може да спестиме 3 байта , грешката е чисто техническа , напрактика кода работи перфектно и така защото false e 0 a true e 1 , и това са просто едни #define-ни Щеше да бачка и ако бях написал вместо int , float , double , char , long long....
По втория , цикъла е t++ , при копирането нещо се е омазало (я съм цъкнал някъде бекспейс без да видя , я макстъна пак е здал)...... От там нататъка ти е ясно каква е идеята и защо не може да се напише по твоя начин.
Това което прави онази част от кода е ако първия ( първия който ни интересува , съответно к-тата колона )елемента от съответния ред с който работим е 0 , намираме друг ред , по-долен от този , за който съответния елемент не е нула.
Ако всичките са нули , то детерминантата е нула. Ако не , ги разменяме 2-та реда.
Съответно, не може да се замени само с проверка на следващия ред.
Още повече че това което си написал: | Код: | if(M[i][i] == 0)
{
bool have=false;
if (M[i+1][i] != 0 && have == true) |
Сам се досещаш че в ифа няма да се влезе никога , тъй като have го иницялизираш с false и няма начин да се промени докато стигне до сегмента  |
|
| Върнете се в началото |
|
 |
steliyan Редовен
Регистриран на: 25 Oct 2006 Мнения: 100
   гласове: 2
|
Пуснато на: Tue Oct 23, 2007 8:50 pm Заглавие: |
|
|
Мда, разбрах те.  |
|
| Върнете се в началото |
|
 |
|
|
Не Можете да пускате нови теми Не Можете да отговаряте на темите Не Можете да променяте съобщенията си Не Можете да изтривате съобщенията си Не Можете да гласувате в анкети You cannot attach files in this forum Може да сваляте файлове от този форум
|
|