Как вы сортируете и эффективно находите элементы в массиве ячеек (строк) в Octave?

Есть ли встроенные функции для этого?

Ответы

Ответ 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.