【问题标题】:iOS - Element-wise conditional-bounds for matrices in Accelerate.frameworkiOS - Accelerate.framework 中矩阵的元素条件边界
【发布时间】:2014-07-16 00:14:41
【问题描述】:

在我的 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 来完成此操作?如果我是正确的,没有直接的方法,但可以结合其他方法来完成同样的事情?

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

【问题讨论】:

  • 我从未使用过加速器框架,但 XOR 操作有帮助吗? x ^ x = 0,除了您要查找的数字之外,所有数字都将非零。希望对你有帮助

标签: ios accelerate-framework vdsp


【解决方案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; }
}

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

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

【讨论】:

  • 这其实是个好办法。直到刚才我还没有尝试过,因为我还没有下载测试版。不过速度很快。
猜你喜欢
  • 1970-01-01
  • 2020-06-14
  • 2021-04-12
  • 2012-05-07
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
相关资源
最近更新 更多