是否有内置功能?
答案 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中实际有效的内容做出不合理的假设。