Как вы сортируете и эффективно находите элементы в массиве ячеек (строк) в Octave?
Есть ли встроенные функции для этого?
Ответы
Ответ 1
Да, проверьте это: 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
Октава ищет массив ячеек:
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).
Ответ 3
Решение 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 в Octave - это контейнер. Соответствующий эквивалент? предлагает использовать javaObject ( "java.util.Hashtable" ). Это будет связано с некоторыми накладными расходами на настройку, но это будет выигрыш в производительности, если вы используете его много. Возможно, будет возможно связать какую-либо библиотеку, написанную на C или С++? Подумайте о том, является ли это поддерживаемым вариантом.
Предостережение: Я относительно новичок в Октаве и записываю это, когда сам изучаю его (вот как я оказался здесь). Я еще не тестировал эффективность этих методов, и, хотя я хорошо разбираюсь в основных алгоритмах, я могу сделать необоснованные предположения о том, что действительно эффективно в Octave.