seb*_*seb 7 c arrays multiplying
我正在尝试在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;
}
Run Code Online (Sandbox Code Playgroud)
没有捷径你必须逐步完成数组的每个元素.
但请注意,在您的示例中,您可以通过使用int而不是使用float数据和乘数来实现加速.
小智 6
如果你愿意,你可以通过优化的BLAS,基本线性代数子程序做你想做的事.这不是C标准,它是你必须自己安装的软件包.
示例代码实现您想要的:
#include <stdio.h>
#include <stdlib.h>
#include <cblas.h>
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");
}
Run Code Online (Sandbox Code Playgroud)
函数的名称并不明显,但阅读指南可能会开始猜测BLAS函数的作用.sscal()可以拆分s为单精度和scalfor scale,这意味着此函数适用于浮点数.具有相同功能的双精度被调用dscal().
如果你需要使用常量缩放矢量并将其添加到另一个,BLAS也可以获得一个函数:
saxpy()
s a x p y
float a*x + y
y[i] += a*x
Run Code Online (Sandbox Code Playgroud)
正如你可能猜到的那样,也有一个daxpy()可行的doubles.