Tag: 矩阵

C中的二元向量和矩阵操作

我试图在C中实现一个数据结构,这将允许我有效地操作**二进制**矩阵(仅包含1或0)。 我将解释我必须对此矩阵应用哪些操作,并想知道使用哪种最佳数据结构? 操作在字段F_2中完成(这意味着1 + 1 = 0,其他操作保持不变)。 我有一个叫做H k * n矩阵( k < n )。 最多, k = 2325, n = 3009。 我必须对此矩阵执行的操作是: 我将仅使用行交换和行添加来部分对角化它。 一旦完成,我将不再使用行操作,并将在此矩阵上运行大量(!)列添加 (我的意思是“很多”是关于((nk)/ 2)³列添加) 我正在考虑矩阵的数据结构: 对于矩阵系数,我考虑在一个单个unsigned int中一次存储多个位的序列。 例如,我可以将序列(11001011)存储到uint8_t 203 (从二进制转换为十进制) 这是个好主意吗 ? 如果我这样做,我有两个选择: 我可以使用uint16_t或uint64_t系数在许多4 * 4或8 * 8子矩阵中分割我的矩阵H. 这是一个很好的选择(在时间效率方面),如果是,是否更好地使用uint16_t或uint64_t ? 另外我在考虑将每一行存储在多个uint32_t或uint64_t ,然后操作我的部分对角化。 接下来切换到将矩阵编码为n列向量以处理剩余操作的结构。 你认为这更有效吗? 无论我使用什么方法,我都必须有效地访问unsigned int的第n位( uint16或64 )。 我怎么做 ?

所有数组元素的比较 – C算法

我有一个矩阵m * n ,对于每一行,我需要比较它们之间的所有元素。 对于我发现的每对情侣,我将调用一个将执行某些计算的函数。 例: my_array -> {1, 2, 3, 4, 5, …} I take 1 and I have: (1,2)(1,3)(1,4)(1,5) I take 2 and I have: (2,1)(2,3)(2,4)(2,5) and so on 使用CI写道: for (i=0; i<array_length; i++) { for (k=0; k<array_length; k++) { if (i==k) continue; //Do something } } } 我想知道我是否可以使用复杂度较低的算法。

如何使用malloc在C中创建矩阵并避免内存问题? 我如何使用C99语法将矩阵传递给函数?

有关使用malloc函数为矩阵分配内存空间的良好迹象吗? 在这些日子里,当我需要使用malloc来管理它们时,我看到许多编码器以“坏”的方式编写矩阵。 我觉得我错了吗? 我所说的“坏”代码的一个例子如下: int main() { char **row; int width=80, height=24, i, j; row = malloc(height * sizeof(char *)); for(i = 0; i < width; i++) row[i] = malloc(width * sizeof(char)); for(i = 0; i < height; i++) { for(j = 0; j < width; j++) { row[i][j] = i*j; } } return 0; […]

行主要与列主要矩阵乘法

我目前正在研究一个试图计算矩阵乘法的C程序。我已经通过循环遍历第二个矩阵的每一列来完成这个任务,如下所示。 我将大小设置为1000。 for(i=0;i<size;i++) { for(j=0;j<size;j++) { for(k=0;k<size;k++) { matC[i][j]+=matA[i][k]*matB[k][j]; } } } 我想知道在这个实现中有什么问题的访问模式..什么使行/列访问比另一个更有效? 我试图从使用Caches的逻辑方面理解这一点。请帮助我理解这一点。 非常感谢您的帮助 :)

C中的矩阵乘法

我正在尝试用C解决矩阵乘法问题。问题(2×2)中给出的矩阵大小我编写了这段代码,但它没有像我期望的那样打印结果。 我想我对C的规则缺少一点。 我在这段代码中的错误是什么? #include int main() { int matA[2][2]={0,1,2,3}; int matB[2][2]={0,1,2,3}; int matC[2][2]; int i, j, k; for (i = 0; i < 2; i++) { for(j = 0; j < 2; j++) { for(k = 0; k < 2; k++) { matC[i][j] += matA[i][k] * matB[k][j]; } printf("%d\n",matC[i][j]); } } } 打印结果: 2 3 […]

FLOPS英特尔核心并使用C(内部产品)进行测试

关于测量触发器,我有一些误解,在英特尔架构上,FLOP是一个加法和一个乘法吗? 我在网上的某处读过这篇文章,没有任何辩论可以拒绝这一点。 我知道FLOP在不同类型的cpu上有不同的含义。 如何计算理论峰值FLOPS? 我正在使用英特尔(R)Core(TM)2 Duo CPU E7400 @ 2.80GHz。 GHz和FLOPS之间究竟有什么关系? (甚至维基百科在FLOPS上的条目也没有具体说明如何做到这一点) 我将使用以下方法来测量我的计算机的实际性能(就翻牌而言):两个向量的内积:对于两个大小为N的向量,是翻牌数2n(n -1)(如果一个加法)或者一次乘法被认为是1次翻牌)。 如果没有,我该如何计算呢? 我知道有更好的方法可以这样做,但我想知道我提出的计算是否正确。 我在某处读到LINPACK作为基准,但我仍然想知道它是如何完成的。

最大尺寸方形子矩阵,全部为1

给定一个二进制矩阵,我找出了全1 s的最大尺寸方形子矩阵。 例如,考虑以下二进制矩阵: 0 1 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 具有所有设置位的最大平方子矩阵是 1 1 1 1 1 1 1 1 1 我在网上搜索了解决方案,并找到了构建辅助矩阵的关系: If M[i][j] is 1 then S[i][j] = min(S[i][j-1], S[i-1][j], S[i-1][j-1]) + […]

马哈拉诺比斯距离反演协方差矩阵

我正在编写一个函数来获取两个向量之间的Mahalanobis距离。 我知道这是使用等式a’* C ^ -1 * b实现的,其中a和b是向量,C是协方差矩阵。 我的问题是,有没有一种有效的方法可以在不使用Gauss-Jordan消除的情况下找到矩阵的逆矩阵,还是没有办法解决这个问题? 我正在寻找一种方法来做到这一点,而不是任何预定义的function。 我知道C是一个Hermitian,正定矩阵,那么有什么方法可以算法利用这个事实呢? 或者是否有一些聪明的方法来计算Mahalanobis距离而不计算协方差的倒数? 任何帮助,将不胜感激。 ***编辑:上面的马哈拉诺比斯距离方程是不正确的。 它应该是x’* C ^ -1 * x,其中x =(ba),而b和a是我们试图找到的距离的两个向量(感谢LRPurser)。 因此,在所选答案中提出的解决方案如下: d = x’* b,其中b = C ^ -1 * x C * b = x,因此使用LU分解或LDL’因子分解来求解b。

有没有任何方法可以将矩阵乘以O(n)复杂度?

我想将两个矩阵相乘,但三重循环具有O(n 3 )复杂度。 动态规划中是否有任何算法将两个矩阵与O(n)复杂度相乘? 好吧,我们不能得到最好的O(n 2.81 ) 编辑:但有没有任何解决方案,甚至可以将结果近似到一些特定的否。 列和行的矩阵 我的意思是我们得到O(n 2.81 )中最好的一个复杂的解决方案,但结果却很完美但是如果有任何解决方案甚至近似矩阵的乘法,因为我们有因子近似等公式。 如果有任何你知道它会帮助我 问候。

转置2Darrays

你如何有效地转置矩阵? 是否有这样的库,或者你会使用什么算法? 例如: short src[W*H] = { {1,2,3}, {4,5,6} }; short dest[W*H]; rotate_90_clockwise(dest,src,W,H); //<– magic in here, no need for in-place //dest is now: { {4, 1}, {5, 2}, {6, 3} }; (在我的具体情况下,它的src数组是原始图像数据,目标是帧缓冲,我在ARM上嵌入了不支持汇编的工具链)