Swift版的Matlab的矢量找到?

时间:2015-05-06 20:02:15

标签: arrays swift vector

我正在寻找能够执行matlab find函数而不需要循环的矢量(快速)代码。 find返回给定函数的值和索引。 Swift的过滤器,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中的非零元素,使用任何输入参数   以前的语法。

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

Non-recursive Automake可能适合此处。它实现了Swift Matrix Library以及许多科学功能。

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

其他功能可在 Speed 中找到,但它提供以下功能:

  • 提供ndarraymatrix课程。所有数学运算符(+-*/)都称为加速函数。
  • ndarray或矩阵调用上的“简单数学”函数(pow / log / exp / sqrt / etc)加速
  • 允许访问简单的启动功能(1/0 /等)
  • 还可以找到更复杂的数学:eig, svd, fft, solve, dot, inv全部实现。

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

(注意:我是作者)