如何在Octave中对单元格数组(字符串)中的元素进行排序和有效查找?

时间:2011-11-22 03:26:22

标签: search sorting find octave cell-array

是否有内置功能?

3 个答案:

答案 0 :(得分:31)

Octave搜索单元格数组:

cellidx按八度音程折旧,它仍然会运行,但他们会说使用ismember,如下所示:

octave:1> a = ["hello"; "world"; "moobar"];

octave:1> c = cellstr(a)

    c = 
    {
      [1,1] = hello
      [2,1] = world
      [3,1] = moobar
    }

octave:1>find(ismember(c, 'world'))

    ans =  2

'world'位于索引槽2中。这是一个昂贵的linear time O(n) operation,因为它必须线性迭代所有元素,无论它是否被找到。

您应尝试以不同方式对问题进行建模,以尝试获得constant time O(1)logarathmic time O(log n) solution

答案 1 :(得分:11)

是的,请查看:http://www.obihiro.ac.jp/~suzukim/masuda/octave/html3/octave_36.html#SEC75

a = ["hello"; "world"];
c = cellstr (a)
     ⇒ c =
         {
           [1,1] = hello
           [2,1] = world
         }
>>> cellidx(c, 'hello')
ans =  1

>>> cellidx(c, 'world')
ans =  2

答案 2 :(得分:3)

cellidx解决方案不符合OP的效率要求,并且已被弃用(如help cellidx所述)。

HåvardGeithus在评论中建议在排序单元格字符串数组上使用lookup()函数,这比cellidx更有效。它仍然是一个二分搜索,而大多数现代语言(甚至许多20岁的语言)使我们可以轻松访问关联数组,这将是一个更好的方法。

虽然Octave显然没有相关的数组,但这实际上是解释器用于ocatve变量的结果,包括结构,所以你可以使用它,如下所述: http://math-blog.com/2011/05/09/associative-arrays-and-cellular-automata-in-octave/

Built-in Function: struct ("field", value, "field", value,...)
Built-in Function: isstruct (expr)
Built-in Function: rmfield (s, f)
Function File: [k1,..., v1] = setfield (s, k1, v1,...)
Function File: [t, p] = orderfields (s1, s2)
Built-in Function: fieldnames (struct)
Built-in Function: isfield (expr, name)
Function File: [v1,...] = getfield (s, key,...)
Function File: substruct (type, subs,...)

Converting Matlab to Octave is there a containers.Map equivalent?建议使用javaObject(“java.util.Hashtable”)。这会带来一些设置开销,但如果你经常使用它会获得性能提升。在用C或C ++编写的一些库中链接甚至可行吗?请考虑这是否是一个可维护的选择。

警告:我对Octave相对较新,并且在我自己研究它的时候写这篇文章(这就是我在这里结束的方式)。我还没有对这些技术的效率进行测试,虽然我对底层算法有了很好的了解,但我可能会对Octave中实际有效的内容做出不合理的假设。