iOS - Accelerate.framework 中矩阵的逐元素条件边界

标签 ios accelerate-framework vdsp

在我的 iOS 代码中,我有一个矩阵 (float *) 变量,如下所示:

[ 1 2 3 4
  5 6 7 8 
  9 0 1 2 ]

我需要构建一个矩阵,其中所有元素的 1 等于某个值(例如 2),并且 0 用于其他所有内容。所以输出将是:

[ 0 1 0 0
  0 0 0 0 
  0 0 0 1 ]

我已经搜索了 vDSP 文档一段时间,但我一直无法找到实现此目的的方法。我找到了 vDSP_vclip() 方法,但它看起来会使上下限值(2)等于2。不完全是我要找的东西。

有谁知道如何使用 iOS 中的 Accelerate.framework 实现这一点? 如果我是对的,没有直接的方法为此,但是是否可以结合其他方法来完成同样的事情?

非常感谢任何建议!我完全被困在这里。

最佳答案

如果您使用的是 Xcode 6 beta,clang 自动矢量化器将为该操作生成良好(但不完美)的矢量代码。它不会像 Accelerate 调用那样高效,但没有一个 Accelerate 函数可以满足您的需求。

#include <stddef.h>

void findTwos(float * restrict matrix, float * restrict ones, size_t n) {
    for (size_t i=0; i<n; ++i) { ones[i] = matrix[i] == 2.0f; }
}

使用 -Ofast-O3-O2 编译会在我的测试中生成不错的矢量代码(在 arm64 和 x86_64 上)。如果矩阵的大小在编译时已知,则将可变大小参数 n 替换为恒定长度也会导致 -Os 处的矢量化。

如果这仍然不够快,您可以随时编写自己的 simd 代码 =)

关于iOS - Accelerate.framework 中矩阵的逐元素条件边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24770194/

相关文章:

ios - 是否可以将 UITests 目标中的文件复制到应用程序的文档目录中?

ios - 如何通过搜索栏创建到另一个 View Controller 的转场?

iphone - 使用 NStimer 设置默认图像的图像动画

swift - Swift 中的代码重复

ios - 如何使用 iOS Accelerate 框架正确填充 2D 数组以进行 FFT

ios - vDSP_desamp FIR 滤波器采样历史连续性

ios - GeoFenceController 与 CLLocationManager 作为单例?

ios - 加速 : how do I add multiple vectors into an output vector of different size from the input vectors?

ios - iOS 上 GPU 上的快速傅里叶变换

ios - 从录制的声音中消除已知音频,通过反卷积估计背景声级