Почему str2double такой медленный в matlab по сравнению с мекс-функцией? - PullRequest
2 голосов
/ 03 декабря 2011

мой вопрос - заголовок.

  1. Почему str2double в matlab такой медленный по сравнению с функцией mex, созданной в C / C ++?Matlab просто не имеет хороших возможностей обработки строк?

  2. Кто-нибудь может дать мне некоторые фактические причины того, почему мекс-функция работает на много порядков быстрее?Я надеялся провести анализ этой разницы во времени выполнения, но у меня нет конкретных причин из кода для Matlab.

  3. Можете ли вы объяснить мне, как я могу открыть в файли на самом деле посмотрите на код, написанный для встроенной функции matlab str2double?

некоторые сообщения на эту тему:

http://www.mathworks.com/matlabcentral/fileexchange/28893-fast-string-to-double-conversion

ДонЯ не понимаю, что означает плакат, когда они пытаются объяснить, как эта функция работает быстрее.Например, что это значит: (str2doubleq - это функция mex, созданная в c ++)

"str2doubleq использует шлюз mex для использования возможностей быстрой обработки строк в c ++ и свойств std :: stringstream. Для преобразования используется то же самоеидеи, которые используются в boost :: lexical_cast "

Никто не может ответить на этот вопрос?

Ответы [ 2 ]

8 голосов
/ 03 декабря 2011

Реализация str2double не скрыта от вас.Чтобы увидеть это, наберите edit str2doulbe.m.Вы также можете запустить профилировщик в своем коде, чтобы увидеть, где в функции все время тратится.

Глядя на функцию, я предполагаю, что она медленная, поскольку b / c sscanf вызывается изнутрицикл.Один из комментаторов в ссылке на обмен файлами, которую вы разместили, предложил использовать следующий код для использования векторизации sscanf:

d = reshape(sscanf(sprintf('%s#', c{:}), '%g#'), size(c));

Это на самом деле намного быстрее, чем str2double для массива ячеек.*

3 голосов
/ 03 декабря 2011

1) str2double - довольно сложная функция, которая может конвертировать множество различных форматов. Я предполагаю, что ваша mex реализация намного проще, и это может объяснить, почему это быстрее. Примеры сомов приведены в справке matlab:

   str2double('123.45e7')
   str2double('123 + 45i')
   str2double('3.14159')
   str2double('2.7i - 3.14')
   str2double({'2.71' '3.1415'})
   str2double('1,200.34')

2) почему мекс быстрее? Потому что, когда вы выполняете стандартный скрипт m-файла, в основном есть программа, которая будет читать вашу программу и выполнять ее (интерпретатор). Итак, есть два слоя. Однако, когда вы пишете mex-файл, вы компилируете его непосредственно на языке CPU, чтобы он мог запускаться непосредственно процессором. Здесь только один слой, поэтому он быстрее. Для более подробной информации, смотрите статью в Википедии:

http://en.wikipedia.org/wiki/Interpreted_language

http://en.wikipedia.org/wiki/Compiled_language

3) Вы не можете увидеть код str2double, потому что он скомпилирован. Matworks не предоставляет код этой функции. Вы можете выполнить это, но не читать это. Это одинаково для всех встроенных функций.

...