9

我正在尝试用 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

4 回答 4

10

没有捷径,您必须逐步遍历数组的每个元素。

但是请注意,在您的示例中,您可以通过使用int而不是float同时使用数据和乘数来实现加速。

于 2013-05-24T12:19:56.353 回答
8

如果您愿意,您可以通过优化的基本线性代数子程序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()可以分为sfor single precisionscalfor scale,这意味着该函数适用于浮点数。调用双精度的相同函数dscal()

如果您需要使用常数缩放向量并将其添加到另一个向量,BLAS 也有一个函数:

saxpy()
s      a x p y
float  a*x + y
y[i] += a*x

正如您可能猜到的那样,还有一个daxpy()适用于doubles.

于 2013-05-24T15:30:29.583 回答
1

恐怕,在 C 中,您将不得不使用for(i = 0; i < 5; i++) data[i] *= 5.0;. Python 允许更多的“捷径”;但是,在 C 中,您必须访问每个元素,然后操作这些值。

使用 for 循环将是完成您尝试对数组执行的操作的最短方法。

编辑:如果您有大量数据,则有更有效的(就运行时间而言)将每个值乘以 5 的方法。例如,查看循环平铺。

于 2013-05-24T12:38:29.810 回答
-3
data *= 5.0;

这里的数据是数组的地址,它是常数。如果要乘以该数组中的第一个值,请使用 * 运算符,如下所示。

*data *= 5.0;
于 2013-05-24T12:58:17.480 回答