我的问题可能看起来很原始或愚蠢,因为我刚刚切换到 C。我已经使用 MATLAB 工作了几年,我了解到任何计算都应该在 MATLAB 中向量化,我应该避免任何for
循环以获得可接受的性能. 似乎如果我想添加两个向量,或者矩阵相乘,或者进行任何其他矩阵计算,我应该使用for
循环。如果您让我知道是否有任何方法可以在向量化的意义上进行计算,例如仅使用一个命令读取向量的所有元素并使用一个命令将这些元素添加到另一个向量,我们将不胜感激。谢谢
3 回答
MATLAB 建议您避免任何for
循环,因为向量和矩阵上可用的大多数操作已经在其 API 中实现并且可以使用。它们可能已经过优化,它们直接在底层数据上工作,而不是在 MATLAB 语言级别上工作,我猜这是一种不透明的实现。
甚至 MATLAB 在下面使用 for 循环来实现它的大部分魔法(或将它们委托给高度专业化的汇编指令或通过 CUDA 到 GPU)。
你问的不是直接可能的,你需要使用循环来处理向量和矩阵,实际上你会搜索一个库,它允许你在不直接使用 for 循环但使用已经定义的函数的情况下完成大部分工作包裹它们。
如前所述,无法隐藏 for 循环。但是,我怀疑 MATLAB 生成的代码在任何方面都比 C 生成的代码快。如果您使用 编译您的 C 代码,-O3
它将尝试使用您的计算机可用的所有硬件功能,例如 SIMD 扩展和多个问题。此外,如果您的代码很好并且不会导致太多管道停顿并且您使用缓存,那么它会非常快。但我认为你正在寻找的是一些图书馆,在谷歌上搜索 LAPACK 或 BLAS,它们可能就是你正在寻找的东西。
在 C 中,没有办法以向量化的方式执行操作。您可以使用结构和函数来抽象出操作的细节,但最终您将始终使用 fors 来处理您的数据。
至于速度 C 是一种编译语言,在 C 中使用 for 循环不会对性能造成影响。C 的好处(与 MATLAB 相比)它不会对您隐藏任何内容,因此您始终可以看到您的时间在哪里正在使用。不利的一面是,您会注意到 MATLAB 使琐碎的事情(svd、cholesky、inv、cond、imread 等)在 C 中具有挑战性。