2016-09-21 9 views
0

У меня есть много больших массивов ячеек (около 10000x100 ячеек каждый), которые содержат массивы символов, иногда это числа как строки, а иногда они «..» или «x» или что-то подобное. Я хочу преобразовать эти массивы ячеек в числовые матрицы (двойные массивы), так что все «числовые строки» - это числа (удваивается) и все остальные нулевые записи.Как скрывать большие массивы смешанных ячеек со строками для быстрой сглаживания матрицы в Matlab?

Пример: у меня есть:

C = {'-34635', '22', 'x', '..', '5'; '..' , 'x', '-343','1','..'}; 

Я хочу:

C_new = [-34635, 22, 0, 0, 5; 0, 0, -343, 1, 0]; 

я могу сделать это с str2num или str2double, но это ужасно медленно. Я читал примеры об использовании sprintf и sscanf, но я не могу заставить его работать.

Любые советы/предложения о том, как достичь этого быстро очень ценятся. Спасибо :)

ответ

2

1) Использование str2double:

C_new = str2double(cellstr(C)); 
C_new(isnan(C_new)) = 0; 

C_new =

-34635   22   0   0   5 
     0   0  -343   1   0 

2) Вероятно, более быстрый способ представлен here (CStr2String). Но это работает, если ваш массив ячеек состоит только из цифр:

reshape(sscanf(sprintf('%s*', C{:}), '%f*'),2,[]) 

3) Вы можете проверить это mex -функцию str2doubleq (mex str2doubleq.cpp). @SenorPenguin проверила эту функцию и обнаружила, что она быстрее. Но есть ошибка в этой функции (см. Комментарии в ответ @SenorPenguin).

4) Если у вас есть MATLAB 2016b, вы можете проверить ответ @ SenorPenguin. К сожалению, double(string(C)) не работает в моем MATLAB 2016a.

Benchmark (1000 раз повторение):

str2double(cellstr(C))  Elapsed time is 1.611320 seconds. 
str2double(C)    Elapsed time is 1.612186 seconds. 
str2doubleq(C)    Elapsed time is 0.027442 seconds. 
+0

Спасибо, я пробовал это раньше, и это работает, это правда, но это ужасно медленно. Я ищу более быстрый способ. –

+0

О 'sscanf' вы видите эту ссылку https://fr.mathworks.com/matlabcentral/answers/18509-cell-conversion-to-double –

+0

У меня появилась идея использовать sprintf и sscanf именно из первой ссылки, которую вы опубликовали. Но я не могу заставить его работать над моими данными только по той причине, о которой вы говорили, а именно о том, что мои данные НЕ состоят только из чисел. Точно мой вопрос. Как решить его для ячейки с не только номерами. Спасибо за помощь. –

2

С cellstrs:

C_new = str2double(C); 
C_new(C_new == nan) = 0; 

Новая строка типа данных вышел в 16b:

S_new = double(string(C)); 
S_new(S_new == nan) = 0; 

Сравнение производительности:

>> C = {'-34635', '22', 'x', '..', '5'; '..' , 'x', '-343','1','..'}; 
>> C = repmat(C,5000,20); 

>> tic; str2double(C); toc 
Elapsed time is 83.301997 seconds. 

>> tic; double(string(C)); toc 
Elapsed time is 0.985841 seconds. 
+0

Хороший ответ (+1). Вы проверили бы скорость для ['str2doubleq'] (http://fr.mathworks.com/matlabcentral/fileexchange/28893-fast-string-to-double-conversion)? В моем компьютере 'str2double (cellstr (C))' sometime быстрее, иногда медленнее, чем 'str2double (C)'. –

+1

'>> tic; str2doubleq (С); TOC; Истекшее время - 0.248111 секунд. ' Как упоминают некоторые комментарии, str2doubleq имеет некоторые ошибки. '>> str2doubleq ('1,000.25')' 'ans = 0.2500 + 0.0000i' – matlabbit

+0

Спасибо. Я подтвердил свой ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^