任何在C中矢量化的方法

时间:2013-01-28 01:29:10

标签: c

我的问题可能看似原始或愚蠢,因为我刚刚切换到C. 我已经使用MATLAB多年了,我已经知道任何计算都应该在MATLAB中进行矢量化,我应该避免任何for循环来获得可接受的性能。 似乎如果我想添加两个向量,或乘法矩阵,或做任何其他矩阵计算,我应该使用for循环。 如果您让我知道是否有任何方法可以在矢量化意义上进行计算,例如,我们将不胜感激。仅使用一个命令读取矢量的所有元素,并使用一个命令将这些元素添加到另一个矢量。 感谢

3 个答案:

答案 0 :(得分:3)

MATLAB建议您避免任何for循环,因为矢量和矩阵上可用的大多数操作已经在其API中实现并且可以使用。它们可能已经过优化,它们直接在底层数据上工作,而不是在MATLAB语言级别工作,我想这是一种不透明的实现。

即使MATLAB使用for循环来实现其大部分魔法(或将它们委托给高度专业化的汇编指令或通过CUDA委托给GPU)。

你所要求的不是直接可能的,你需要使用循环来处理向量和矩阵,实际上你会搜索library,它允许你完成大部分工作而不直接使用for循环,但通过使用已定义的函数包装它们。

答案 1 :(得分:2)

如前所述,无法隐藏for循环。但是,我怀疑MATLAB生成的代码是否比C生成的代码更快。如果使用-O3编译C代码,它将尝试使用您的计算机可用的每个硬件功能,例如SIMD扩展和多个问题。此外,如果您的代码很好并且它不会导致太多的管道停顿并且您使用缓存,那么它将非常快。 但我认为你正在寻找的是一些图书馆,搜索谷歌搜索LAPACK或BLAS,它们可能就是你想要的。

答案 2 :(得分:0)

在C中,无法以矢量化方式执行操作。您可以使用结构和函数来抽象出操作的细节,但最终您将始终使用fors来处理数据。

至于速度C是一种编译语言,你不会因在C中使用for循环而受到性能影响.C有一个好处(与MATLAB相比)它不会隐藏任何东西,所以你总能看到哪里你的时间正在被使用。在缺点方面,你会发现MATLAB使得微不足道的事情(svd,cholesky,inv,cond,imread等)在C中具有挑战性。