多线程求行列式值

原创 2016年05月31日 09:37:18
#include<iostream>
#include<pthread.h>
#include<cstdlib>
#include<cstdio>
#include<sys/time.h>
#include<stdlib.h>
#include<string.h>
#include<iomanip>
using namespace std;
#define Max_Matrix_size 1000
#define Max_pthread_size 100
double Matrix[Max_Matrix_size][Max_Matrix_size];
int Matrix_size;
int Thread_num;
int Per_thread_do;
double Per_thread_cal[Max_pthread_size];
double result = 0.0;
pthread_mutex_t mut;
double det_cal(double **mmatrix,int size){
	if(size == 1){
		return mmatrix[0][0];
	}
	else{
		double res = 0.0;
		double **matrix = (double **)malloc(sizeof(double*) * (size));
		for(int i = 0;i < size - 1;i++){
			matrix[i] = (double *)malloc(sizeof(double) * (size));
		}
		for(int i = 0;i < size;i++){
			for(int j = 1;j < size;j++){
				for(int k = 0;k < size;k++){
					if(k < i){
						matrix[j - 1][k] = mmatrix[j][k];
					}
					if(k > i){
						matrix[j - 1][k - 1] = mmatrix[j][k];
					}
				}
			}
			if(i % 2 == 0){
				res += mmatrix[0][i] * det_cal(matrix,size - 1);
			}
			else{
				res -= mmatrix[0][i] * det_cal(matrix,size - 1);
			}
		}
		for (int i = 0; i < size - 1; i++) {
			free(matrix[i]);
		}
		free(matrix);
		return res;
	}
}
void *t_hread(void *arg){
	int q = *(int*)arg;
	double **matrix = (double **)malloc(sizeof(double*) * (Matrix_size));     
	for(int i = 0;i < Matrix_size;i++){
		matrix[i] = (double *)malloc(sizeof(double) * (Matrix_size));
	}
	if(q != Thread_num - 1){
		for(int i = q * Per_thread_do;i < ((q + 1) * Per_thread_do);i++){
			for(int j = 1;j < Matrix_size;j++){
				for(int k = 0;k < Matrix_size;k++){
					if(k < i){
						matrix[j - 1][k] = Matrix[j][k];
					}
					if(k > i){
						matrix[j - 1][k - 1] = Matrix[j][k];
					}
				}
			}
			if(i % 2 == 0){
				Per_thread_cal[q] += Matrix[0][i] * det_cal(matrix,Matrix_size - 1);	
			}
			
			else{
				Per_thread_cal[q] -= Matrix[0][i] * det_cal(matrix,Matrix_size - 1);
			}
		}		
	} 
	if(q == Thread_num - 1){
		for(int i = q * Per_thread_do;i < Matrix_size;i++){
			for(int j = 1;j < Matrix_size;j++){
				for(int k = 0;k < Matrix_size;k++){
					if(k < i){
						matrix[j - 1][k] = Matrix[j][k];
					}
					if(k > i){
						matrix[j - 1][k - 1] = Matrix[j][k];
					}
				}
			}
			if(i % 2 == 0){
				Per_thread_cal[q] += Matrix[0][i] * det_cal(matrix,Matrix_size - 1);	
			}
			
			else{
				Per_thread_cal[q] -= Matrix[0][i] * det_cal(matrix,Matrix_size - 1);
			}
		}		
	}
	pthread_mutex_lock(&mut);
	result += Per_thread_cal[q];
	pthread_mutex_unlock(&mut);
	for(int i = 0;i < Matrix_size - 1;i++){
		free(matrix[i]);
	}
	free(matrix);
	pthread_exit(0);
}
int main(int argc,char *argv[]){
	if(argc != 4){
		cout<<"Input format:MATRIX_SIZE,THREAD_NUM,INPUT_FILE"<<endl;
		return 0;
	}	
	memset(Per_thread_cal, 0.0, sizeof(Per_thread_cal));
	Matrix_size = atoi(argv[1]);    
	Thread_num = atoi(argv[2]);		
	char *input = argv[3];			
	Per_thread_do = Matrix_size / Thread_num;		
	pthread_mutex_init(&mut,NULL);
	freopen(input,"r",stdin);					
	for(int i = 0;i < Matrix_size;i++){
		for(int j = 0;j < Matrix_size;j++){
			cin>>Matrix[i][j];
		}
	}															
	pthread_t thread[Max_pthread_size];
	//int id[100];
	int *id = (int *)malloc(sizeof(int) * (Thread_num));
	struct timeval begin,end;
    gettimeofday(&begin,NULL);
	for(int i = 0;i < Thread_num;i++){
		id[i] = i;
		pthread_create(&thread[i],NULL,t_hread,(void*)&id[i]);
	}
	for(int i = 0;i < Thread_num;i++){
		pthread_join(thread[i],NULL);
	}
	free(id);
	cout<<fixed<<setprecision(2)<<result<<endl;
	gettimeofday(&end,NULL);
	int time = (end.tv_sec - begin.tv_sec) * 1000000 + (end.tv_usec - begin.tv_usec);
    printf("time: %d us\n", time);
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

用行列式的定义方法求解n阶行列式的值(C++)

用行列式的定义方法求解行列式的值,方法肯定不是最简单的,但是觉得有趣。其中要用到全排列的递归算法、逆序数的算法 #include using namespace std; const int n =...
  • QianYiYu
  • QianYiYu
  • 2017年03月15日 22:27
  • 1957

c语言实现求行列式值

double hanglieshi(double *h,int i,int j) { int k,l; if(i!=j) { printf("Error"); return 0; } ...
  • u011146989
  • u011146989
  • 2014年10月02日 19:25
  • 1128

用C语言编程递归求行列式的值

/************************************************************************功能: 用递归方法求行列式的值作者: 黄志斌 于 广西...
  • benny5609
  • benny5609
  • 2007年09月17日 10:43
  • 2228

Java之行列式求值

public class MatrixDet { public static double Det(double [][]Matrix,int N)//计算n阶行列式(N=n-1) { in...
  • u014581901
  • u014581901
  • 2016年03月04日 15:47
  • 1726

计算行列式的值

遇到一个问题,就是计算方块矩阵的行列式值。 在网上找了一些现成的,但是问题是太慢了,原因是这些现成的都是依据行列式值定义来进行计算的。 没办法自己按照书上的比较快速的计算方法写了个程序,如下。 基本原...
  • lff0305
  • lff0305
  • 2016年05月08日 10:14
  • 634

C++ 求一个矩阵的行列式的值(星星笔记)

求矩阵的行列式(即矩阵必须为方阵(n×n)); 原理:将一个矩阵经过初等行变换化为上三角矩阵。...
  • XX_123_1_RJ
  • XX_123_1_RJ
  • 2014年09月14日 09:34
  • 7400

VC++ 求矩阵的转置和行列式的值(线性代数)

C++和线代无疑是天作之合,线代里的矩阵内容很多都能用C++求解,冥冥之中这两者的联系还会有更深层次的不为人知的秘密。目前利用C++求线代里的东西无疑是行列式的值、矩阵的转置、伴随矩阵、逆矩阵,这里先...
  • Antares_SANTALEN
  • Antares_SANTALEN
  • 2016年09月13日 09:50
  • 797

java实现N阶行列式求解

import java.text.DecimalFormat; /*** * N阶行列式求解 * @author imlilu * */ public class Test { publ...
  • wo17796452
  • wo17796452
  • 2015年06月29日 10:36
  • 1512

N阶行列式计算程序(VB,递归)

行列式计算程序(VB,已修改为N阶)2007-03-29 14:37 用递归算法 ...
  • stardreams
  • stardreams
  • 2007年04月04日 14:09
  • 2694

ACM矩阵行列式计算

ACM行列式计算 计算行列式的基本方法就是把矩阵化成上三角或下三角,然后观察对角线的元素,如果其中有个一元素为0则整体为0,否则行列式的值就是对角线上各个元素的乘积。      先说明一下行列式的...
  • zhoufenqin
  • zhoufenqin
  • 2012年07月27日 15:31
  • 5243
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程求行列式值
举报原因:
原因补充:

(最多只允许输入30个字)