返回首页

我需要一些帮助我了解这些代码

是有人在这里可以向我解释这些代码的重要模块?
请我真的需要帮助


//-------------------------------------------

#include<iostream.h>

#include<stdlib.h>

#include<conio.h>

//--------------------------------------

#define BREAK 2

#define a11 a->p[0]

#define a12 a->p[1]

#define a21 a->p[2]

#define a22 a->p[3]

#define b11 b->p[0]

#define b12 b->p[1]

#define b21 b->p[2]

#define b22 b->p[3]

#define c11 c->p[0]

#define c12 c->p[1]

#define c21 c->p[2]

#define c22 c->p[3]

#define d11 d->p[0]

#define d12 d->p[1]

#define d21 d->p[2]

#define d22 d->p[3]

//-------------------------------------------------

typedef double **matrix;

typedef union _strassen_matrix

{

    matrix d;

    union _strassen_matrix **p;

} *strassen_matrix;

//----------------------------------------------

matrix  new_matrix(int);

strassen_matrix new_strassen(int);

void normal_to_strassen(matrix, strassen_matrix, int);

void strassen_to_normal(strassen_matrix, matrix, int);

matrix  strassen_submatrix(strassen_matrix, int, int, int);

void copy_matrix(matrix, matrix, int);

void add_matrix(matrix, matrix, matrix, int);

void sub_matrix(matrix, matrix, matrix, int);

void copy_strassen(strassen_matrix, strassen_matrix, int);

void add_strassen(strassen_matrix, strassen_matrix, strassen_matrix, int);

void sub_strassen(strassen_matrix, strassen_matrix, strassen_matrix, int);

void mul_matrix(matrix, matrix, matrix, int);

void mul_strassen(strassen_matrix, strassen_matrix, strassen_matrix, strassen_matrix, int);

void print_matrix(matrix, int);

int least_power_of_two(int);

 

//------------------------------------------------

matrix new_matrix(int n)

{

  matrix a = (matrix) malloc(sizeof(double *) * n);

   for (int j = 0; j < n; j++)

		a[j] = (double *) malloc(sizeof(double) * n);

	return(a);

}

//------------------------------------------------

strassen_matrix new_strassen(int n)

{

    strassen_matrix	a;

    a = (strassen_matrix)malloc(sizeof(*a));

    if (n <= BREAK)

      	a->d = (matrix ) new_matrix(n);

   else

	{

		register int 	m = n/2;

      a->p = (strassen_matrix *)malloc(4*sizeof(strassen_matrix));

		a11 = new_strassen(m);

		a12 = new_strassen(m);

		a21 = new_strassen(m);

		a22 = new_strassen(m);

    }

    return a;

}

//----------------------------------------------------

matrix strassen_submatrix(strassen_matrix a,

	int i,

	int j,

	int n

)

{

	if (n <= BREAK)

			return(a->d);

	else

	{

		int cur_bit, bit_num;

		strassen_matrix cur_ptr = a;

      bit_num = least_power_of_two(n)-1;

		cur_bit = n/2;

		while (cur_bit >= BREAK)

		{

			cur_ptr = cur_ptr->p[(((j & cur_bit) | ((i & cur_bit)*2)) >> bit_num)];

			cur_bit >>= 1;

			bit_num--;

		}

		return (cur_ptr->d);

	}

}

//----------------------------------------------------------------

void normal_to_strassen(matrix a,strassen_matrix b,int n)

{

	if (n <= BREAK)

		copy_matrix(a,b->d,n);

	else

	{

		int		i,j,ii,jj;

		matrix 	sub;

 

		for (i=0; i<n;>		{

			for (j=0; j<n;>			{

				sub = strassen_submatrix(b,i,j,n);

				for (ii=0; ii<break;>					for (jj=0; jj<break;>								sub[ii][jj] = a[i+ii][j+jj];

         }

		}

	}

}

//------------------------------------------------------------

void strassen_to_normal(strassen_matrix a,matrix b,int n)

{

	if (n <= BREAK)

	copy_matrix(a->d,b, n);

	else

	{

	matrix 	sub;

     	for (int i=0; i<n;>		{

			for (int j=0; j<n;>			{

				sub = strassen_submatrix(a,i,j,n);

				for (int ii=0; ii<break;>			  			for (int jj=0; jj<break;>								b[i+ii][j+jj] = sub[ii][jj];

			}

		}

	}

}

//--------------------------------------------------------

void copy_matrix(matrix a,matrix b,int n)

{

  	for(int i=0; i<n;> 		for(int j=0; j<n;>				b[i][j] = a[i][j];

}

void add_matrix(matrix a,matrix b,matrix c,int n)

{

	for (int i=0; i<n;>		for (int j=0; j<n;>			c[i][j] = b[i][j] + a[i][j];

}

//-------------------------------------------------------

void sub_matrix(matrix a,matrix b,matrix c,int n)

{

 for (int i=0; i<n;>  	for (int j=0; j<n;>		c[i][j] = a[i][j] - b[i][j];

}

//-----------------------------------------------------------

void add_strassen(strassen_matrix a,strassen_matrix b,strassen_matrix c,int n)

{

	if (n <= BREAK)

			add_matrix(a->d, b->d, c->d, n);

	else

	{

		int m=n/2;

		add_strassen(a11, b11, c11, m);

		add_strassen(a12, b12, c12, m);

		add_strassen(a21, b21, c21, m);

		add_strassen(a22, b22, c22, m);

	}

}

//-----------------------------------------------------------

void sub_strassen(strassen_matrix a,strassen_matrix b,strassen_matrix c,int n)

{

	if (n <= BREAK)

	{

		sub_matrix(a->d, b->d, c->d, n);

	}

	else

	{

		int m = n/2;

		sub_strassen(a11, b11, c11, m);

		sub_strassen(a12, b12, c12, m);

		sub_strassen(a21, b21, c21, m);

		sub_strassen(a22, b22, c22, m);

	}

}

//----------------------------------------------------------

void mul_matrix(matrix 	a,matrix b,matrix c,int n)

{

	for(int i=0; i<n;>	for(int j=0; j<n;>	{

		c[i][j] = 0.0;

		for(int k=0; k<n;>     	}

}

//--------------------------------------------------------------------

void mul_strassen(strassen_matrix a,strassen_matrix b,strassen_matrix c,strassen_matrix d,int n)

{

	if (n <= BREAK) mul_matrix(a->d,b->d,c->d,n);

	else

	{

		int m = n/2;

		sub_strassen(a12, a22, d11, m);

		add_strassen(b21, b22, d12, m);

		mul_strassen(d11, d12, c11, d21, m);

		sub_strassen(a21, a11, d11, m);

		add_strassen(b11, b12, d12, m);

		mul_strassen(d11, d12, c22, d21, m);

		add_strassen(a11, a12, d11, m);

		mul_strassen(d11, b22, c12, d12, m);

		sub_strassen(c11, c12, c11, m);

		sub_strassen(b21, b11, d11, m);

		mul_strassen(a22, d11, c21, d12, m);

		add_strassen(c21, c11, c11, m);

		sub_strassen(b12, b22, d11, m);

		mul_strassen(a11, d11, d12, d21, m);

		add_strassen(d12, c12, c12, m);

		add_strassen(d12, c22, c22, m);

		add_strassen(a21, a22, d11, m);

		mul_strassen(d11, b11, d12, d21, m);

		add_strassen(d12, c21, c21, m);

		sub_strassen(c22, d12, c22, m);

		add_strassen(a11, a22, d11, m);

		add_strassen(b11, b22, d12, m);

		mul_strassen(d11, d12, d21, d22, m);

		add_strassen(d21, c11, c11, m);

		add_strassen(d21, c22, c22, m);

	}

}

//------------------------------------------------------------------

void print_matrix(matrix a,int n)

{

for(int i=0;i<n;i++)>

	{

		for(int j=0;j<n;j++)>		cout<<endl;

	}

}

//---------------------------------------------------------------------

int least_power_of_two(int n )

{

	int i = 1, k = 1;

	if (n==1) return (0);

	while ((k <<= 1) < n) i++;

	return(i);

}

//---------------------------------------------------

void readMatrix(matrix a,int n)

{

   for(int i=0; i<n;>	for(int j=0; j<n;>		cin>>a[i][j];

}

//---------------------------------------------------

void main()

{

	clrscr();

	int n;

	matrix  a1, a2;

	strassen_matrix b1, b2, b3, b4;

	cout<<"Enter Size Of Matrix(Power Of 2):\n";

	cin>>n;

	a1 = (matrix) new_matrix(n);

	a2 = (matrix) new_matrix(n);

	b1 = (strassen_matrix) new_strassen(n);

	b2 = (strassen_matrix) new_strassen(n);

	b3 = (strassen_matrix) new_strassen(n);

	b4 = (strassen_matrix) new_strassen(n);

	cout<<"Enter Matrix One\n";

	readMatrix(a1,n);

	cout<<"Enter Matrix Two\n";

	readMatrix(a2,n);

	normal_to_strassen(a1,b1,n);

	normal_to_strassen(a2,b2,n);

	mul_strassen(b1,b2,b3,b4,n);

	strassen_to_normal(b3,a2,n);

	cout<<"Result Is: \n";

	print_matrix(a2,n);

	getch();

}

</conio.h></stdlib.h></iostream.h>
:8384021 |会员

回答

评论会员:游客 时间:2012/02/06
如果你想了解如何实现算法工程的代码,那么你首先需要了解的算法。当你这样做,那么你应该能够看到代码是如何匹配算法中所述的步骤。下面是维基百科条目上Strassen算法。imgsrc=当你的教授要你把你的功课吗?OriginalGriff
"?是有人在这里可以向我解释每一行代码"


解释每一行 - 甚至是一个很琐碎的方案,这不,相当 - 需要一段文字左右。这需要大量的时间,我们一般不具备这样的指导。

相反,无论是去你的导师,并要求他们做到这一点,或回到你的代码,并问他们(很好),如果他们可以尝试使用合理的变量名,注释的东西到一个合理的标准。 | Timberbird
评论会员:游客 时间:2012/02/06
有一定的人,可以解释每一行按照您的要求,但我怀疑有人会。你看,粘贴250线方案,并要求完整的解释-将需要相当大量的时间和精力,没有你这么认为吗?这里的人有很多其他的事情要做,一定可以花几个小时,对他们更重要的东西。所以恐怕你只能得到完整的解释,如果有些无聊的计算机科学/数学老师有很多空余时间,会看到你的消息。这是不可能的。这并不意味着没有人会帮助你,当然。花自己研究的一些努力,读好书C和矩阵,试着去了解这个方案,最后,你会来,只是少数的问题,人们在这里会很乐意帮助
| Stefan_Lang:这是快速部分答案,并张贴问题时,你真的应该阅读的文本解释这意味着什么。除其他事项外,它说你的问题应该是短期的和具体的。既不是你的问题。除非你大大缩短您的问题和限制自己要求一个或几个具体问题,没有人会给你答案。

此外,即使有人做了,你问什么,代码是不是很好,你会从它那里得到有用的信息很少。

考虑它到底是什么,你需要知道的。我们不会给你,以你的功课完整的解决方案,但如果你觉得无法自己做,认为它是什么阻止你这样做,并询问具体的事情。在任何情况下,如果您的问题,你没有打扰付诸任何努力,试图了解自己,然后这里的人们会发现至少不愿意把在努力回答你的问题。你必须要学习,首先:会员8384021
评论会员:游客 时间:2012/02/06
|感谢回答你很我不是在C初学者,但这个方案是我的项目,我要实现我的疑问,所以我想知道这些代码的每一个事情,这样我就可以很好peresent但我同意你都需要大量的时间和精力!!和你没有太多的时间!我想了解的重要步骤,是这些模块:mul_strassen,sub_strassen,add_strassen,strassen_to_normal,normal_to_strassen,矩阵strassen_submatrix,strassen_matrixnew_strassen只是简短的注释此过程对我来说是不够的。我只是想知道为什么这些程序被定义。感谢alot