Это сложно, потому что регулярное выражение может иметь несколько совпадений, и каждый захват может совпадать несколько раз в одном глобальном сопоставлении.
Может быть, что-то вроде этого (игровая площадка) :
fn main() {
let re = Regex::new(r"(?P\d{4})-(?P\d{2})-(?P\d{2})").unwrap();
let text = "2012-03-14";
let caps = re.captures(text).unwrap();
let dict: HashMap<&str, &str> = re
.capture_names()
.flatten()
.filter_map(|n| Some((n, caps.name(n)?.as_str())))
.collect();
println!("{:#?}", dict);
}
Это выводит:
{
"y": "2012",
"d": "14",
"m": "03"
}
Код прост, когда вы понимаете, что имена захвата не доступно от самого Match
, но от родителя Regex
. Вы должны сделать следующее:
capture_names()
, итерация будет равна Option<&str>
. flatten()
итерация, которая удалит None
и развернуть значения &str
. filter_map()
имена захвата в список кортежей (имя, значение) типа (&str, &str)
. filter
необходим для удаления отсутствующих снимков (благодаря @Anders). collect()
! Это просто работает, потому что HashMap
реализует черту FromIterator<(K, V)>
, поэтому итератор (&str, &str)
собирает в HasMap<&str, &str>
. Я использовал libSVM. Это довольно быстро и легко, и обеспечивает некоторые полезные инструменты, также. Существуют некоторые примеры его используемы здесь. Другая хорошая вещь состоит в том, что существуют реализации в C++ и Java также поэтому, если Вы должны будете для разработки за пределами Matlab (для превращения прототипа во что-то быстрое, например), то у Вас будет знакомый интерфейс для работы с.
Вы всегда можете использовать реализацию SVM в MathWorks в Bioinformatics Toolbox с функциями: svmtrain и svmclassify , которые, как обычно, имеют отличную документацию
Это не дает прямого ответа на ваш вопрос, но если вы хотите ускорить M-скрипт, посмотрите на встроенный набор инструментов Matlab и функции MEX. По сути, вы можете использовать эти инструменты для компиляции ваших M-скриптов, я сделал это и получаю минимум прироста производительности на порядок. В MW говорят, что можно добиться 100-кратного улучшения.