我正在使用加速框架来优化我的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);
必须有更好的方法来做到这一点!?谢谢!
答案 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_vclr
和vDSP_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)