Tag: 矩阵

数值配方的LU分解不起作用; 我究竟做错了什么?

我已经从提供的用于就地LU矩阵分解的C的Numerical Recipes的源代码中复制和粘贴,问题是它无法正常工作。 我确信我做的事情很愚蠢,但我很高兴有人能指出我正确的方向; 我一整天都在努力,看不出我做错了什么。 POST-ANSWER UPDATE:项目已完成并正在运行 。 感谢大家的指导。 #include #include #include #define MAT1 3 #define TINY 1e-20 int h_NR_LU_decomp(float *a, int *indx){ //Taken from Numerical Recipies for C int i,imax,j,k; float big,dum,sum,temp; int n=MAT1; float vv[MAT1]; int d=1.0; //Loop over rows to get implicit scaling info for (i=0;i<n;i++) { big=0.0; for (j=0;j big) big=temp; if […]

给定矩阵,找到行数和列数

我想在不知道任何其他事情的情况下找到矩阵所具有的行数和列数。 例: int * findElements(int matInput[][]) { /*Count blah*/ /*Now to run a loop till the number of rows*/ /*I need to know the size of the matrix to run the loop above*/ } 我不能运行循环来查找大小,因为我不知道何时终止,也不知道矩阵是否在创建时被初始化。 还有其他方法吗?

旋转矩阵的方向向量

如何从方向创建旋转矩阵(单位矢量) 我的矩阵是3×3,专栏和右手 我知道’column1’是正确的,’column2’是向上的,’column3’是向前的 但我不能这样做。 //3×3, Right Hand struct Mat3x3 { Vec3 column1; Vec3 column2; Vec3 column3; void makeRotationDir(const Vec3& direction) { //:(( } }

二进制矩阵向量乘法

我想将8×8 二进制矩阵乘以由无符号字符表示的8位向量表示为无符号64位整数。 但是,由于一些其他问题,矩阵必须按列排序,因此不容易匹配字节以便于乘法。 知道如何加快这样的计算吗? 每项操作都很重要,我需要进行数十亿次这样的计算。 乘法是在2元素场(F-2)上进行的。

优化的2×2矩阵乘法:慢速assembly与快速SIMD

问题 我正在研究高性能矩阵乘法算法,如OpenBLAS或GotoBLAS,我正在尝试重现一些结果。 这个问题涉及矩阵乘法算法的内核。 具体来说,我正在研究计算C += AB ,其中A和B是在我的CPU的峰值速度下类型为double 2×2矩阵。 有两种方法可以做到这一点。 一种方法是使用SIMD指令。 第二种方法是使用SIMD寄存器直接在汇编代码中编码。 到目前为止我看过的是什么 所有相关的论文,课程网页,许多SO Q&As处理主题(太多无法列出),我在我的计算机上编译了OpenBLAS,查看了OpenBLAS,GotoBLAS和BLIS源代码,Agner的手册。 硬件 我的CPU是Intel i5 – 540M。 您可以在cpu-world.com上找到相关的CPUID信息。 微体系结构是Nehalem(westmere),因此理论上每循环每个核心可以计算4个双精度触发器。 我将只使用一个核心(没有OpenMP),因此,对于超线程关闭和4步Intel Turbo Boost,我应该看到( 2.533 Ghz + 4*0.133 Ghz ) * ( 4 DP flops/core/cycle ) * ( 1 core ) = 12.27 DP Gflops的峰值( 2.533 Ghz + 4*0.133 Ghz ) * ( 4 DP […]

用于数学矩阵运算的C库

我知道对于所有类型的矩阵分解(QR分解,SVD,……),乘法等都有一些优化的算法。 然而,我找不到一个好的概述。 对于C ++, 这个问题中有一些有用的信息,但我在C中寻找那些东西。

用C测量时间

我正在尝试用C(矩阵乘法)测量一些活动,并注意到我应该做这样的事情: clock_t start = clock(); sleep(3); clock_t end = clock(); double elapsed_time = (end – start)/(double)CLOCKS_PER_SEC; printf(“Elapsed time: %.2f.\n”, elapsed_time); 输出是: Elapsed time: 0.00. 为什么会这样?

如何从更大的矩阵中提取2×2子矩阵

我是一个非常基本的用户,并不太了解C中使用的命令,所以请耐心等待…我不能使用非常复杂的代码。 我对stdio.h和ctype.h库有一些了解,但就此而言。 我在txt文件中有一个矩阵,我想根据输入的行数和列数来加载矩阵 例如,我在文件中有一个5乘5的矩阵。 我想提取一个特定的2乘2子矩阵,我该怎么做? 我创建了一个嵌套循环使用: FILE *sample sample=fopen(“randomfile.txt”,”r”); for(i=0;i<rows;i++){ for(j=0;j<cols;j++){ fscanf(sample,"%f",&matrix[i][j]); } fscanf(sample,"\n",&matrix[i][j]); } fclose(sample); 可悲的是,代码不起作用..如果我有这个矩阵: 5.00 4.00 5.00 6.00 5.00 4.00 3.00 25.00 5.00 3.00 4.00 23.00 5.00 2.00 352.00 6.00 输入3为行,3为列,我得到: 5.00 4.00 5.00 6.00 5.00 4.00 3.00 25.00 5.00 不仅这不是一个2乘2的子矩阵,但即使我想要前3行和前3列,它也不能正确打印…. 我需要从第3行和第3列开始,然后选择2乘2的子矩阵! 我应该最终得到: 4.00 23.00 352.00 6.00 我听说我可以使用fgets和sscanf来实现这一目标。 这是我的试用代码: fgets(garbage,1,fin); sscanf(garbage,”\n”); 但这也不起作用:( […]

转换4×4字节矩阵的最快方法

我有一个4×4字节块,我想使用通用硬件进行转置。 换句话说,对于字节AP,我正在寻找最有效的(就指令数量而言)的方式 ABCD EFGH IJKL MNOP 至 AEIM BFJN CGKO DHLP 我们可以假设我在内存中有指向A , E , I和M有效指针(这样从A读取32位将得到包含字节ABCD的整数)。 由于对大小和数据类型的限制,这不是此问题的重复。 我的矩阵的每一行都可以容纳32位整数,我正在寻找能够使用通用硬件快速执行转置的答案,类似于SSE宏_MM_TRANSPOSE4_PS 。

带有指针的int矩阵 – 内存分配混乱

我在生成int矩阵时遇到了一些问题而没有产生内存泄漏。 我希望能够通过read_matrix()动态地将给定(全局)矩阵制作成任意大小。 但后来我希望能够在以后释放内存。 所以在我的main方法中,第二个printf应该导致总线错误,因为它不应该分配任何内存。 我将如何创建这个? int** first_matrix; int** second_matrix; int** result_matrix; int** read_matrix(int size_x, int size_y) { int** matrix; matrix = calloc(size_x, sizeof(int*)); for(int i = 0;i<size_x;i++) { matrix[i] = calloc(size_y, sizeof(int)); } for(int i = 0;i<size_x;i++) { for(int j = 0;j<size_y;j++) { matrix[i][j] = i*10+j; } } return matrix; } int main(int stackc, char** […]