我正从python迁移到C,希望更快地实现,并尝试学习C中的矢量化,相当于python矢量化。例如,假设我们有二进制数组Input_Binary_Array,如果我想要将索引的每个元素(例如,i )乘以2**i,然后在python向量化中,将所有非零的求和进行如下操作:
case 1 : Value = (2. ** (np.nonzero(Input_Binary_Array)[0] + 1)).sum()或者,如果我们执行slicing并执行元素加法/减法/乘法,则执行以下操作:
case 2 : Array_opr= (Input_Binary_Array[size:] * 2**Size -Input_Binary_Array[:-size])C是一种功能强大的低级语言,所以简单的for/while循环要快得多,但我不确定没有像python这样的等效向量化。
因此,我的问题是,是否有明确的向量化代码用于:
1.
将数组的所有元素相乘
常数(标量)
2.
元素加法,减法,除法两个给定的相同大小的数组。
3.
切片,求和,累积求和
或者,简单的for,while循环是执行上面操作(如python矢量化)的唯一更快的选项(案例1,2)?
发布于 2022-07-13 17:29:54
答案是要么使用一个库来实现这些目标,要么编写一个库。C语言本身是相当简约的。这是上诉的一部分。有些库包括Intel MLK,还有gsl,它有大量的其他功能,还有更多。
现在,尽管如此,我建议如果从Python是您的计划,那么从PythontoC++是更好的计划。我之所以这么说,是因为C++已经有了很多工具,可以在语法上构建您喜欢的东西。
具体来说,您需要查看C++ std::within、迭代器、范围和lambda表达式,它们都在C++20中工作得很好。我能够在我自己的奇怪的集合上做我自己的迭代器,然后将Linq样式的函数加入到它上,并具有Linq语义.
所以我可以说
mycollection<int> myvector = { 1, 2, 4, 5 };不管怎么说-初始化表达式规则我有时会忘记。
auto v = mycollection
.where( []( auto& itm ) { itm > 3; } )
.sum( []( auto& itm ) { return itm; } );或多或少地得到我所期望的。
由于您将迭代器控制到您可能需要的每一个细节(而且std框架已经考虑到了许多细节),所以您可以让它以您需要的速度运行,使用多个核心等等。
事实上,我认为MS和GCC的STL实际上都有并行算法的交换,您只需要使用它们。
所以C是好的,但是考虑C++,如果你要走"C喜欢“的路线。因为这是使用所需语法获得所需性能的唯一途径。
迭代器基本上允许将for循环的概念包装为对象。所以,
发布于 2022-07-14 01:24:57
因此,我的问题是,是否有明确的向量化代码用于:
1.
将数组的所有元素相乘
常数(标量)
C语言本身没有用一条简单语句来表示这一点的语法。人们通常会编写一个循环来逐元素执行乘法元素,或者可能找到或编写一个处理它的库。
还请注意,据我所知,Python语言也没有这种功能。特别是,Python列表和整数n的乘积不是列表元素的标量乘法,而是n倍元素的列表。您的一些Python示例看起来可能使用的是Numpy,它可以提供这样的功能,但这是一个第三方包,类似于C中的库。
元素加法,减法,除法两个给定的相同大小的数组。
和上面一样。这也不包括Python,至少不包括任何内置Python运算符对内置类型对象的影响。
切片,求和,累积求和
C有有限的数组切片,因为您可以以数组本身的方式或多或少地访问数组的连续子数组。然而,“片”一词通常不被使用。
C没有内置的数组sum()函数.
或者,简单的for,while循环是执行上述操作(如python )的唯一更快的选项(例1,2)?
有越来越多的第三方C库,包括一些优秀的线性代数库.C语言和标准库没有内置的这些特性。您通常会在编写显式循环、编写自定义库和集成第三方库中进行选择,这取决于您的代码在多大程度上依赖于这些操作,您是否需要或可以从针对特定情况的自定义中获益,以及操作是否需要高度优化。
https://stackoverflow.com/questions/72970186
复制相似问题