コード例 #1
0
ファイル: ch8.c プロジェクト: jtrfid/C-Repositories
/*******************************************************
 * ch8, p193, 9. 编写程序:
 * (1)初始化一个矩阵A(5*5),元素值取自随机函数,并输出;
 * (2)将其传递给函数,实现矩阵转置;
 * (3)在主函数中输出结果。 
 *******************************************************/ 
void ch8_9()
{
     //(1)初始化矩阵:
     int a[5][5];
     int i,j;
     
     // void srand(unsigned int seed)是随机数发生器的初始化函数,其参数是发生器的种子,使用系统当前时间作为种子,time(0) 
     // int rand(void)函数返回随机数,范围0~RAND_MAX,至少是双字节,32767。
     // 用"int x = rand() % 100;"来生成 0 到 100 之间的随机数这种方法是不或取的,
     // 比较好的做法是: j=(int)(n*rand()/(RAND_MAX+1.0))产生一个0到n之间的随机数  
     srand(time(0)); 
     for(i=0;i<5;i++)
     {
       for(j=0;j<5;j++)
       {
           a[i][j] = (int) (100.0*rand())/(RAND_MAX+1.0); // 0~100的随机数       
       }
     }
     
     printf("随机5*5矩阵:\n"); 
     matrixPrint(&a[0][0],5,5);    // 打印输出 
     
     // (2)转置 
     printf("转置后:\n"); 
     NmatrixTranspose(&a[0][0],5); // 方阵转置 
     matrixPrint(&a[0][0],5,5);    // 打印输出 
} 
コード例 #2
0
// LLSQ Approx. Trilateration
void locateLLSQ(int numantennas, double* antennas, double* distances, double* x)
{
	// function saves triangulated position in vector x
	// input *antennas holds
	// x1, y1, z1,
	// x2, y2, z2,
	// x3, y3, z3,
	// x4, y4, z4;
	// numantennas holds integer number of antennas (min 5)
	// double *distances holds pointer to array holding distances from each antenna
	// Theory used:
	// http://inside.mines.edu/~whereman/talks/TurgutOzal-11-Trilateration.pdf

	// define some locals
	int m = (numantennas - 1); // Number of rows in A
	int n = 3; // Number of columns in A (always three)
	if (m >= 4)n = 4; // Number of columns in A: three coordinates plus K
	double A[m * n];
	double b[m * 1];
	double r;
	double Atranspose[n * m];
	double AtAinA[n * m];
	double AtA[n * n];

	//Calculating b vector
	for (int i = 0; i < m; i++)
	{
		r = dist(antennas[0], antennas[1], antennas[2], antennas[(i + 1) * 3], antennas[(i + 1) * 3 + 1], antennas[(i + 1) * 3 + 2]);
		b[i] = 0.5*(distances[0] * distances[0] - distances[i + 1] * distances[i + 1] + r * r); // If given exact distances
		if (n == 4)b[i] = 0.5 * r*r; // For the case when we calculate K, overwrite b
	}

#ifdef VERBOSE
	matrixPrint(b, m, 1, "b");
#endif // DEBUG


	//Calculating A matrix
	for (int i = 0; i < m; i++)
	{
		A[i * n] = antennas[(i + 1) * 3] - antennas[0];         //xi-x1
		A[i * n + 1] = antennas[(i + 1) * 3 + 1] - antennas[1]; //yi-y1
		A[i * n + 2] = antennas[(i + 1) * 3 + 2] - antennas[2]; //zi-z1
		if (n == 4) A[i * n + 3] = -0.5 * (distances[0] * distances[0] - distances[i + 1] * distances[i + 1]); // for K
	}

#ifdef VERBOSE
	matrixPrint(A, m, n, "A");
#endif // DEBUG

	matrixTranspose(A, m, n, Atranspose);
	matrixMult(Atranspose, A, n, m, n, AtA);

	if (matrixInvert(AtA, n) == 1)   //well behaved
	{
		matrixMult(AtA, Atranspose, n, n, m, AtAinA);
		matrixMult(AtAinA, b, n, m, 1, x);

	}
	else      // Ill-behaved A
	{

		double Q[m * m], Qtranspose[m * m], Qtransposeb[m * 1];
		double R[m * m];
		QR(A, m, n, Q, R);
		matrixTranspose(Q, m, m, Qtranspose);
		matrixMult(Qtranspose, b, m, m, 1, Qtransposeb);
		matrixInvert(R, m);
		matrixMult(R, Qtransposeb, m, m, 1, x);
	}

	// Adding back the reference point
	x[0] = x[0] + antennas[0];
	x[1] = x[1] + antennas[1];
	x[2] = x[2] + antennas[2];
	if (n == 4)x[3] = 1 / sqrt(x[3]); // Calculate K
}
コード例 #3
0
ファイル: ch8.c プロジェクト: jtrfid/C-Repositories
void ch8()
{
	printf("==========ch8()\n");

    /**************************************************************************/
    /*********************通用函数测试*****************************************/
    	
	// 通用函数,m*n矩阵打印输出 
    printf("void matrixPrint(int a[],int m,int n),通用函数,m*n矩阵打印输出.\n");
    int matrix1[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
    printf("-----maxtrix1,3行3列\n"); 
    //matrixPrint(matrix1,3,3); // [Warning] passing arg 1 of `matrixPrint' from incompatible pointer type  
    //matrixPrint(matrix1[],3,3); // [Warning] passing arg 1 of `matrixPrint' from incompatible pointer type
    matrixPrint(&matrix1[0][0],3,3); // ok
    // matrixPrint(*matrix1,3,3);  // ok
    
    printf("-----maxtrix2,3行2列\n");
    int matrix2[3][2] = {{1,2},{3,4},{5,6}}; 
    matrixPrint(&matrix2[0][0],3,2);
    printf("-----maxtrix3,2行3列\n");
    int matrix3[2][3] = {{1,2,3},{4,5,6}}; 
    matrixPrint(&matrix3[0][0],2,3);
    printf("-----maxtrix4,1行3列\n");
    int matrix4[3] = {1,2,3}; 
    matrixPrint(matrix4,1,3);
    
    // 通用函数,n*n矩阵转置
    printf("-----maxtrix1方阵转置\n");
    NmatrixTranspose(&matrix1[0][0],3);
    matrixPrint(&matrix1[0][0],3,3);
    
    // 通用函数,m*n矩阵转置,即n*m矩阵,m行n列数组转为n行m列
    printf("-----maxtrix2转置\n");
    int matrix2_T[2][3]; 
    MNmatrixTranspose(&matrix2[0][0],3,2,*matrix2_T);
    matrixPrint(&matrix2_T[0][0],2,3);
    
    printf("-----maxtrix3转置\n");
    int matrix3_T[3][2]; 
    MNmatrixTranspose(&matrix3[0][0],2,3,*matrix3_T);
    matrixPrint(&matrix3_T[0][0],3,2);
    
    printf("-----maxtrix4转置\n");
    int matrix4_T[3][1]; 
    MNmatrixTranspose(matrix4,1,3,*matrix4_T);
    matrixPrint(&matrix4_T[0][0],3,1); 
    
    /*********************通用函数测试, 结束***********************************/
    /**************************************************************************/
	
	// int ch8_1(char *s)
	printf("int ch8_1(char *s),求字符串的长度。\n");
    printf("\"12345\"字符串长度为:%d\n",ch8_1("12345")); 
    
    // ch8_2(const char *s1, char *s2, int m)
    printf("ch8_2(const char *s1, char *s2, int m),从s1的第m个字符开始复制成s2\n");
    char s1[]="123456",s2[80];  //s2[0]='\0',注意,一定给字符串初始化为以'\0'结束,
    ch8_2(s1,s2,3);
    printf("从%s的第%d个字符开始复制成%s\n",s1,3,s2);
    
    // char *ch8_2_1(const char *s1, char *s2, int m)
    strcpy(s1,"123456");
    printf("函数返回字符串=%s\n",ch8_2_1(s1,s2,3)); 
    
    // ch8_3(char *s),统计s中字母、数字、空格和其它字符的个数; 
    printf("ch8_3(char *s),统计s中字母、数字、空格和其它字符的个数\n");
    int Letter,Number,Space,Other; 
    ch8_3("123  d1 --- ",&Letter, &Number, &Space, &Other); 
    printf("字母、数字、空格和其它字符的个数=%d,%d,%d,%d\n",Letter,Number,Space,Other); 
    
    /**************************************************/
    // ch8_4(int a[][],int n) 矩阵转置。
    printf("ch8_4(int a[][],int n),矩阵转置。\n");
    int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 
    
    ch8_4(a,3);
    
    int i,j;
    for(i=0;i<3;i++)
    {
     for(j=0;j<3;j++) printf("%3d",a[i][j]);
     printf("\n");
    }
    /*****************************************************/
     
    // ch8_5(),5*5矩阵元素排列
    printf("ch8_5(),5*5矩阵元素排列\n");
    ch8_5(); 
    
    // int ch8_6(char *str1,char *str2),自定义版的strcmp
    printf("int ch8_6(const char *str1,const char *str2),自定义版的strcmp. \n"); 
    printf("123和1234比较=%d,%d\n",ch8_6("123","1234"),strcmp("123","1234"));
    printf("123和123比较=%d,%d\n",ch8_6("123","123"),strcmp("123","123"));
    printf("12a和123比较=%d,%d\n",ch8_6("12a","123"),strcmp("12a","123"));
    
    // char* ch8_7(char *dest,const char *source),自定义版的strcpy
    char dest[80]="";
    char source[] = "abcd"; 
    printf("copy %s to dest,%s\n",source,ch8_7(dest,source));
    
    // int ch8_8(int argc, char *argv[]),模拟main函数,接收命令行参数
    printf("int ch8_8(int argc, char *argv[]),模拟main函数,接收命令行参数\n");
    char *argv[] = {"parameter1","parameter2"};
    ch8_8(2,argv);
    
    // void ch8_9(),产生一个随机5*5矩阵,并转置
    printf("void ch8_9(),产生一个随机5*5矩阵,并转置.\n");
    ch8_9();
    
    // void ch8_10(),指针数组测试
    printf("void ch8_10(),指针数组测试.\n");
    ch8_10(); 
		
	// 学习指导,p60,指针
	exercise();

}