/******************************************************* * 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); // 打印输出 }
// 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 }
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(); }