使用 vDSP 复制阵列内容
Posted
技术标签:
【中文标题】使用 vDSP 复制阵列内容【英文标题】:Copying Array Contents with vDSP 【发布时间】:2013-02-04 23:38:33 【问题描述】:我正在使用加速框架来优化我的 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);
必须有更好的方法来做到这一点!?谢谢!
【问题讨论】:
【参考方案1】:如果您愿意使用 Accelerate 的 BLAS 部分,Jeff Biggus 已将 cblas_scopy()
标为比 memcpy()
更快。
【讨论】:
这绝对是例外而不是常态;我的建议一般是使用memcpy
。【参考方案2】:
memcpy怎么样?
#include <string.h>
memcpy(destArray, sourceArray, arrayLength * sizeof(float));
【讨论】:
如果源步幅和目标步幅为 1,这很好,但非统一步幅呢? 这将复制 'arrayLength' 浮点数。需要将 >1 的步幅计算到 arrayLength 中。 Here 是使用vDSP_vsadd
与零跨步数组和普通 for 循环之间的比较。如果它们不是很大,似乎没有性能差异......我一直使用vDSP_vsadd
。【参考方案3】:
我能想到比vDSP_vsmul()
更糟糕的方法;你也可以vvcopysign()
。
【讨论】:
【参考方案4】:您可以使用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);
或者更简洁,您也可以使用 Brad Larson 所说的 'cblas_scopy'
// Init source and destination
// We copy source[0, sourceLength] into destination[initialIndex, initialIndex + sourceLength]
cblas_scopy(sourceLength, source, 1, (destination+initialIndex), 1);
【讨论】:
vDSP_vfill 用标量值填充数组,而不是数组中的值。 我的坏@olynoise。为了回答你的问题,我编辑了我之前的帖子【参考方案5】:我认为这是最好的复制方式。
将一个子矩阵的内容复制到另一个子矩阵;单精度。 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)
【讨论】:
以上是关于使用 vDSP 复制阵列内容的主要内容,如果未能解决你的问题,请参考以下文章