예제 #1
0
파일: eigenvalues.cpp 프로젝트: jakwuh/bsu
	Vector gauss(Matrix a) {
		Matrix ac(a);
		Vector xs(a.size());
		for (int i = 0; i < xs.size(); ++i) xs[i] = i;
		for (int i = 0; i < ac.size(); ++i) {
			double max = fabs(a[i][i]), maxI = i, maxJ = i;
			for (int l = i; l < ac.size(); ++l) {
				for (int m = i; m < ac.size(); ++m) {
					if (fabs(ac[l][m]) > max) {
						max = fabs(ac[l][m]);
						maxI = l;
						maxJ = m;
					}
				}
			}
			if (maxI != i) ac = swap_rows(ac, i, maxI);
			if (maxJ != i) ac = swap_cols(ac, i, maxJ);
			swap(xs[i], xs[maxJ]);

			for (int k = i + 1; k < ac.size(); ++k) {
				double c = - ac[k][i] / ac[i][i];
				for (int j = i; j < ac[0].size(); ++j) {
					ac[k][j] += c * ac[i][j];
				}
			}
			for (int j = ac[0].size() - 1; j >= i; --j) {
				ac[i][j] /= ac[i][i];
			}
		}
		Vector v(ac.size());
		for (int i = ac.size() - 1; i >= 0; --i) {
			v[xs[i]] = ac[i][ac[0].size()-1];
			for (int j = i + 1; j < ac.size(); ++j) {
				v[xs[i]] -= v[xs[j]] * ac[i][j];
			}
		}
		return v;
	}
예제 #2
0
파일: matrix.cpp 프로젝트: soxjke/DPSE_GUI2
bool matrix::inverse()
{
	if (n!=m) return false;
	matrix temp(n,n);
	temp=*this;
	matrix E(n,n);
	for(size_t i=0; i<n; i++)
	{
		for(size_t j=0; j<n; j++)
		{
			(i==j)?E.p[n*i+j]=1.0:E.p[n*i+j]=0.0;
		}
	}
	for(size_t k=0; k<n; k++)
	{
		size_t left_col,upper_row;
		bool has_nozero=false;
		for(size_t i=k; i<n; i++)
		{
			for(size_t j=k; j<n; j++)
			{
				if (p[i+j*n]!=0.0)
				{
					has_nozero=true;
					upper_row=j;
					break;
				}
			}
			if (has_nozero)
			{
				left_col=i;
				break;
			}
		}
		if (!has_nozero)
		{
			*this=temp;
			return false;
		}
		swap_cols(k,left_col);
		E.swap_cols(k,left_col);
		swap_rows(k,upper_row);
		E.swap_rows(k,upper_row);
		long double coeff=p[k*(n+1)];
		divide_row(k,coeff);
		E.divide_row(k,coeff);
		for(size_t i=k+1; i<n; i++)
		{
			coeff=p[i*n+k];
			sub_multed_row(k,i,coeff);
			E.sub_multed_row(k,i,coeff);
		}
	}
	for(size_t k=n-1; k>0; k--)
	{
		for(size_t i=k; i>0;)
		{
			long double coeff=p[--i*n+k];
			sub_multed_row(k,i,coeff);
			E.sub_multed_row(k,i,coeff);
		}
	}
	*this=E;
	return true;
}