0

在我的代码中,我有一个看起来像这样iOS的矩阵 ( ) 变量:float *

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

我需要构建一个矩阵,它1的所有元素都等于一个值(2例如),而0其他所有元素都是 's。所以输出将是:

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

我已经vDSP搜索了一段时间的文档,但我一直无法找到一种方法来做到这一点。我找到了该vDSP_vclip()方法,但看起来它会使边界()上下的值2等于2. 不完全是我要找的。

有谁知道如何用Accelerate.frameworkin完成这个iOS如果我是正确的,那么没有直接的方法,但是可以结合其他方法来完成同样的事情吗?

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

4

1 回答 1

1

如果您使用的是 Xcode 6 测试版,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; }
}

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

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

于 2014-07-16T10:37:53.113 回答