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

时间:2014-07-16 00:14:42

标签: ios accelerate-framework vdsp

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

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

我需要为所有等于值的元素构建一个1&#39的矩阵(例如,让2说出来),{{1}其他一切都是如此。所以输出将是:

0

我已经在[ 0 1 0 0 0 0 0 0 0 0 0 1 ] 文档上搜索了一段时间,但我还没有找到办法来做到这一点。我找到了vDSP方法,但看起来它会使得上限和下限(vDSP_vclip())的值等于2。不完全是我正在寻找的东西。

有人知道如何使用2中的Accelerate.framework来完成此操作吗?如果我更正,那么这不是一个直接的方法,但是可以结合其他方法来完成同样的事情吗?

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

1 个答案:

答案 0 :(得分:1)

如果您正在使用Xcode 6 beta,则clang自动矢量化器将为此操作生成良好(但不完美)的矢量代码。它不会像加速调用那样高效,但是没有一个可以达到你想要的加速功能。

#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代码=)