Как вы сортируете и эффективно находите элементы в массиве ячеек (строк) в Октаве?
есть встроенные функции для этого?
3 ответов
да проверьте это: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
Октава поиск массива ячеек:
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. Это дорого линейное время o(n) операций потому что он должен перебирать все элементы линейно, независимо от того, найден он или нет.
вы должны попытаться смоделировать свою проблему по-другому, пытаясь достичь постоянная времени O (1) или логарафмическое время o (log n) решение.
решение cellidx не отвечает требованиям эффективности OP и устарело (как отмечено help cellidx
).
Håvard Geithus в комментарии предложил использовать функцию 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,...)
преобразование Matlab в октаву есть контейнеры.Эквивалент карты? предлагает использовать javaObject ("java.утиль.коллекция Hashtable.)" Это было бы приходите с некоторыми накладными расходами на настройку, но это будет выигрыш в производительности, если вы используете его много. Может быть, даже можно связать в какой-то библиотеке, написанной на C или c++? Подумайте о том, является ли это поддерживаемым вариантом.
предостережение: я относительно новичок в Octave и пишу это, когда я сам исследую его (вот как я оказался здесь). Я еще не проводил тесты на эффективность этих методов, и, хотя у меня есть достаточное знание основных алгоритмов, я, возможно, делаю необоснованные предположения о том, что на самом деле эффективно в Октаве.