我正在尝试优化我在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;
}
答案 0 :(得分:8)
没有捷径可以逐步完成数组的每个元素。
但是请注意,在您的示例中,您可以使用int
而不是float
来获得数据和乘数的加速。
答案 1 :(得分: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");
}
函数的名称并不明显,但阅读指南可能会开始猜测 BLAS 函数的作用。 sscal()
可以分为s
单精度和scal
scale
,这意味着此函数适用于浮点数。 双精度的相同功能称为dscal()
。
如果您需要使用常量缩放矢量并将其添加到另一个,BLAS也会为此获得一个函数:
saxpy()
s a x p y
float a*x + y
y[i] += a*x
正如您可能猜到的那样daxpy()
也适用于doubles
。
答案 2 :(得分:1)
我担心,在C中,你必须使用for(i = 0; i < 5; i++) data[i] *= 5.0;
。
Python允许更多的“快捷方式”;但是,在C中,您必须访问每个元素,然后操纵这些值。
使用for循环将是完成您尝试对阵列执行的操作的最短路径。
编辑:如果你有大量的数据,那么有效的(就运行时间而言)方法可以将5乘以每个值。例如,检查循环平铺。
答案 3 :(得分:-2)
data *= 5.0;
此处 数据 是数组的地址,它是常量。 如果要将该数组中的第一个值相乘,则使用*运算符,如下所示。
*data *= 5.0;