【问题标题】:Swift version of Matlab's vector find?Matlab 的向量的 Swift 版本?
【发布时间】:2015-05-06 20:02:14
【问题描述】:

我正在寻找可以执行 matlab find 函数没有循环的向量(快速)代码。 find 返回给定函数的值和索引。 Swift 的 filter、map 或 reduce 不返回索引。

例子

X = [18 3 1 11; 8 10 11 3; 9 14 6 1; 4 3 15 21]

[row,col] = find(X>0 & X<10,3)

row =

     2
     3
     4


col =

     1
     1
     1

来自 matlab 文档

[row,col] = find(___) 返回每个的行和列下标 使用任何输入参数的数组 X 中的非零元素 以前的语法。

【问题讨论】:

  • "find 返回值和索引 ..." 我无法从您的示例或 Matlab 文档中看到,结果只是行/列索引。 – 你需要一种用于“矩阵”(不是内置的 Swift 类型)还是只用于数组(又名“向量”)的方法?
  • 现在,我很乐意先从向量开始,然后再到矩阵。
  • 您是否研究过 Accelerate 框架。我没有记忆中的所有方法,但你可能会在那里找到一些高性能
  • 我花了一些时间浏览文档,但没有找到向量的结果,但我认为可能有矩阵???读起来有点混乱。

标签: arrays swift vector


【解决方案1】:

enumerate() 返回一个索引/元素对序列,它可以 被过滤:

let vec = [18, 3, 1, 11, 8, 10, 11, 3, 9]
let result = filter(enumerate(vec), { (idx, elem) in elem > 2 && elem < 10 } )
println(result) // [(1, 3), (4, 8), (7, 3), (8, 9)]

或者,如果你只想要索引:

let indexes = filter(enumerate(vec), { (idx, elem) in elem > 2 && elem < 10 } ).map { $0.0 }
println(indexes) // [1, 4, 7, 8]

【讨论】:

  • 太好了,要继续使用矩阵,您需要加入加速框架吗?
  • @GAlexander:您可以将矩阵表示为嵌套数组,请参阅stackoverflow.com/questions/24051490/…stackoverflow.com/questions/28936824/… 或类似线程。 Accelerate 框架中的方法可能更快,但它们使用纯 C 数据类型,这使得在像 filter 这样的 Swift 函数中使用它们有点困难。我在 Accelerate 方面没有太多经验,因此无法就此提供建议。
  • 我正在使用它们。用于 Swift 数组的 FFT。应该很好用。
  • @Volker:有 Accelerate 方法来查找满足谓词的向量/矩阵元素的索引吗?
  • @MartinR 在我对这个问题的评论中我没有记忆中的全部功能,但是当最后浏览时,我想我抓住了一次机会。可能首先需要像阈值一样起作用,然后是索引/值提取。不过,我可能错了。
【解决方案2】:

Swift Matrix Library 在这里可能是合适的。它实现了argwhere 以及许多科学功能。

这个库的灵感来自 Python 和 Matlab。该框架从 Swift 调用 Accelerate 框架,因此速度非常快(速度测试可以在 Speed 中找到)。

可以在 Examples 中找到更多功能,但它提供以下功能:

  • 提供ndarraymatrix 类。所有数学运算符 (+-*/) 都调用 Accelerate 函数。
  • ndarray 或矩阵调用 Accelerate 上的“简单数学”函数 (pow/log/exp/sqrt/etc)
  • 允许访问简单的初始化函数(ones/zeros/etc)
  • 还可以找到更复杂的数学运算:eig, svd, fft, solve, dot, inv 都已实现。

安装详情可以在Install中找到。

(注:我是作者)

【讨论】:

    猜你喜欢
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2014-02-16
    • 2017-01-28
    • 1970-01-01
    相关资源
    最近更新 更多