将数组中的每个元素乘以C中的数字

时间:2013-05-24 12:18:15

标签: 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;

}

4 个答案:

答案 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;