Демьян М.
9 повідомлень
#14 років тому
Здравствуйте. При написании приложения столкнулся с проблемой нахождения определителя матрицы NxN, где N=>80 . Для небольших матриц написал пару функций, приведённых ниже, но при N>10 возникает переполнение памяти. Задача заключается в нахождении обратной матрицы, может существуют библиотеки для вычисления обратной матрицы неограниченного размера? Буду безумно рад, если кто-нибудь подскажет метод решения данной проблемы.

//Нахождение определителя матрицы
float det(int N,float** A){ // N-размерность матрицы, A-собственно матрица
float sum=0;
if(N!=2)
for(int i=0;i<N;i++){ //Разложение по первой строке
sum+=pow((-1),(i+2))*A*det(N-1,minor(0,i,N,A));
}
else
sum=A*A-A*A;
return sum;
}
//Минор матрицы
float** minor(int z,int x,int N, float** A){
float **C = new float*;
for(int i=0;i<N-1;i++)
C=new float;
for(int h=0,i=0; i<N-1;i++,h++){
if(i==z) h++;
for(int k=0,j=0;j<N-1;j++,k++){
if(k==x) k++;
C=A;
}
}
return C;
}

Пытался привинтить библиотеки МATLABа -ничего не вышло. Видимо из-за длинны строк в файлах библиотек.
Поскольку приходится работать с приложением MS Excel, вычислял определитель матрицы на страницах, но из-за большого количества матриц(до пятиста) и медленной скорости импорта-экспорта через Ole вычисления займут пару лет=)
Медленно схожу с ума.
Дмитрий С.
8 повідомлень
#14 років тому
Пишите в личку, помогу.
Олег Казакевич
702 повідомлення
#14 років тому
MDamien, ищите библиотеки для работы с матрицами - там все это, как правило, хорошо оттестировано,
документировано, и вообще пригодно для продуктов промышленного уровня.

Навскидку - можно посмотреть Intel Performance Primitives и Math Kernel Library, поискать в Boost и STLSoft.
На RSDN спросите, в конце концов - там много специалистов высокого уровня и самого широкого профиля.
Демьян М.
9 повідомлень
#14 років тому
Поскольку нахождение определителя матрицы являлось подзадачей для нахождения обратной матрицы,на одном из форумов нашёл решение проблемы. Необходимо немного доработать, но работает исправно. Проверено на матрицах N>100

void minvert(int N,long double** matrix){
long double** e= new long double*;
// initializing matrix e
for(int i=0;i<N;i++)
e= new long double;
for (int i=0;i<N;i++)
for (int j=0;j<N;j++)
e=(i==j?1:0);
// converting matrix to e
for(int i=0;i<N;i++)
{
// normalizing row (making first element =1)
long double tmp=matrix;
for(int j=N-1;j>=0;j--)
{
e/=tmp;
matrix/=tmp;
}
// excluding i-th element from each row except i-th one
for(int j=0;j<N;j++)
if (j!=i)
{
tmp=matrix;
for(int k=N-1;k>=0;k--)
{
e-=e*tmp;
matrix-=matrix*tmp;
}
}
}
// now e contains inverted matrix so we need only to copy e to matrix
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
matrix=e;
}
Владимир Ф.
1322 повідомлення
#14 років тому
Оффтопик
Чему студентов программистов интересно учат сейчас? Создать сайт визитку в php?
Матриц помню этих было...
И разложения Гаусса и нахождение обратной и всякие транспортные задачи, линейное программирование..
Путного в плане технологий было крайне мало, но матриц и прочего выше крыши..
Константин Т.
589 повідомлень
#14 років тому
MDamien, это называется Метод Гаусса решения системы линейных уравнений. И у него есть проблемы, например с точностью при маленьких коэффициентах.
Демьян М.
9 повідомлень
#14 років тому
Уважаемые господа, в курсе университета изучали нахождение обратной матрицы с помощью союзной. Хорошо зная этот метод, использовал его. Основной проблемой стало нахождение определителя. В курсе университета определитель матрицы для N>3 находили путём разложения по строке или столбцу. Других способов нахождения определителя (Не считая "метод треугольников" для случая N=3 и элементарного, для N=2) я, к сожалению, не знал. Проблема с переполнением была обнаружена при тестировании на реальных данных, когда работа подошла к концу. Сроки поджимали. Решил обратиться за советом, тем временем штудируя литературу и форумы. Большое спасибо okman за дельный совет и Pilat66 за предупреждение. К счастью, заказчика точность вычислений и прогнозирования более чем устроила.