首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C矢量化:在像python矢量化这样的数组中可以进行元素操作吗?

C矢量化:在像python矢量化这样的数组中可以进行元素操作吗?
EN

Stack Overflow用户
提问于 2022-07-13 17:13:05
回答 2查看 57关注 0票数 1

我正从python迁移到C,希望更快地实现,并尝试学习C中的矢量化,相当于python矢量化。例如,假设我们有二进制数组Input_Binary_Array,如果我想要将索引的每个元素(例如,i )乘以2**i,然后在python向量化中,将所有非零的求和进行如下操作:

代码语言:javascript
复制
case 1 : Value = (2. ** (np.nonzero(Input_Binary_Array)[0] + 1)).sum()

或者,如果我们执行slicing并执行元素加法/减法/乘法,则执行以下操作:

代码语言:javascript
复制
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)?

EN

回答 2

Stack Overflow用户

发布于 2022-07-13 17:29:54

答案是要么使用一个库来实现这些目标,要么编写一个库。C语言本身是相当简约的。这是上诉的一部分。有些库包括Intel MLK,还有gsl,它有大量的其他功能,还有更多。

现在,尽管如此,我建议如果从Python是您的计划,那么从PythontoC++是更好的计划。我之所以这么说,是因为C++已经有了很多工具,可以在语法上构建您喜欢的东西。

具体来说,您需要查看C++ std::within、迭代器、范围和lambda表达式,它们都在C++20中工作得很好。我能够在我自己的奇怪的集合上做我自己的迭代器,然后将Linq样式的函数加入到它上,并具有Linq语义.

所以我可以说

代码语言:javascript
复制
mycollection<int> myvector = { 1, 2, 4, 5 };

不管怎么说-初始化表达式规则我有时会忘记。

代码语言:javascript
复制
auto v = mycollection
.where( []( auto& itm ) { itm > 3; } )
.sum( []( auto& itm ) { return itm; } );

或多或少地得到我所期望的。

由于您将迭代器控制到您可能需要的每一个细节(而且std框架已经考虑到了许多细节),所以您可以让它以您需要的速度运行,使用多个核心等等。

事实上,我认为MS和GCC的STL实际上都有并行算法的交换,您只需要使用它们。

所以C是好的,但是考虑C++,如果你要走"C喜欢“的路线。因为这是使用所需语法获得所需性能的唯一途径。

迭代器基本上允许将for循环的概念包装为对象。所以,

票数 0
EN

Stack Overflow用户

发布于 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语言和标准库没有内置的这些特性。您通常会在编写显式循环、编写自定义库和集成第三方库中进行选择,这取决于您的代码在多大程度上依赖于这些操作,您是否需要或可以从针对特定情况的自定义中获益,以及操作是否需要高度优化。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72970186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档