使用vDSP复制数组内容

时间:2013-02-04 23:38:33

标签: ios accelerate-framework

我正在使用加速框架来优化我的DSP代码。有几次我想将一个数组(或数组的一部分)的内容复制到另一个数组。

我似乎无法找到合适的函数来执行此操作,因此我一直在做一些愚蠢的事情,即将数组乘以1(或加0)并以此方式获取副本。

float one = 1;

float sourceArray = new float[arrayLength];
/////....sourceArray is filled up with data

float destArray = new float[arrayLength];

vDSP_vsmul(sourceArray, 1, &one, destArray, 1, arrayLength);

必须有更好的方法来做到这一点!?谢谢!

5 个答案:

答案 0 :(得分:8)

memcpy怎么样?

#include <string.h>

memcpy(destArray, sourceArray, arrayLength * sizeof(float));

答案 1 :(得分:8)

如果您愿意使用Accelerate的BLAS部分,那么Jeff Biggus已将cblas_scopy()标记为比memcpy()更快。

答案 2 :(得分:1)

我可以想到vDSP_vsmul();你也可以做vvcopysign()

答案 3 :(得分:0)

您可以使用vDSP_vclrvDSP_vadd,如下所示:

int sourceLength = 3;
float* source = (float*)malloc(sourceLength * sizeof(float));
// source is filled with data, let's say [5, 5, 5]

int destinationLength = 10;
float* destination = (float*)malloc(destinationLength * sizeof(float));
// destination is filled with ones so [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

// Prepare the destination array to receive the source array
// by setting its values to 0 in the range [initialIndex, initialIndex + N-1]
int initialIndex = 2;
vDSP_vclr((destination+initialIndex), 1, sourceLength);

// We add source[0, N-1] into destination[initialIndex, initialIndex + N-1]
vDSP_vadd(source, 1, (destination+initialIndex), 1, (destination+initialIndex), 1, sourceLength);

或者更简洁,你也可以使用'cblas_scopy'作为Brad Larson说的

// Init source and destination
// We copy source[0, sourceLength] into destination[initialIndex, initialIndex + sourceLength]
cblas_scopy(sourceLength, source, 1, (destination+initialIndex), 1);

答案 4 :(得分:0)

我认为这是最好的复制方式。

将子矩阵的内容复制到另一个子矩阵;单精度。 https://developer.apple.com/documentation/accelerate/1449950-vdsp_mmov

func vDSP_mmov(_ __A: UnsafePointer<Float>, 
             _ __C: UnsafeMutablePointer<Float>, 
             _ __M: vDSP_Length, 
             _ __N: vDSP_Length, 
             _ __TA: vDSP_Length, 
             _ __TC: vDSP_Length)