我正在尝试在C中优化我的一些代码,这比下面的代码段大很多.来自Python,我想知道你是否可以简单地将整个数组乘以我下面的数字.
显然,它不像我在下面那样工作.有没有其他方法可以实现相同的功能,或者我必须像for循环一样遍历整个数组?
void main() { int i; float data[] = {1.,2.,3.,4.,5.}; //this fails data *= 5.0; //this works for(i = 0; i < 5; i++) data[i] *= 5.0; }
simonc.. 8
没有捷径你必须逐步完成数组的每个元素.
但请注意,在您的示例中,您可以通过使用int
而不是使用float
数据和乘数来实现加速.
没有捷径你必须逐步完成数组的每个元素.
但请注意,在您的示例中,您可以通过使用int
而不是使用float
数据和乘数来实现加速.
如果你愿意,你可以通过优化的BLAS,基本线性代数子程序做你想做的事.这不是C标准,它是你必须自己安装的软件包.
示例代码实现您想要的:
#include#include #include int main () { int limit =10; float *a = calloc( limit, sizeof(float)); for ( int i = 0; i < limit ; i++){ a[i] = i; } cblas_sscal( limit , 0.5f, a, 1); for ( int i = 0; i < limit ; i++){ printf("%3f, " , a[i]); } printf("\n"); }
函数的名称并不明显,但阅读指南可能会开始猜测BLAS函数的作用.sscal()
可以拆分s
为单精度和scal
for scale
,这意味着此函数适用于浮点数.具有相同功能的双精度被调用dscal()
.
如果你需要使用常量缩放矢量并将其添加到另一个,BLAS也可以获得一个函数:
saxpy() s a x p y float a*x + y y[i] += a*x
正如你可能猜到的那样,也有一个daxpy()
可行的doubles
.