2015-07-01 4 views
1

Я хочу преобразовать очень большие матрицы в стробированную строку ячеек. Я создал следующий код, однако он очень медленный, и я хотел бы улучшить его как можно больше.MATLAB эффективно преобразует матрицу в стробированную строку ячейки

tic 
r = rand(1000,1000); 
p = rand(1000,1000); 

a = cellstr(num2str(r(:),'%+.2f')); 
a = strrep(a,'+',' '); 
a = strrep(a,'0.','.'); 
a = strcat(a(:),{' '}); 
idx_05 = find(p<.05); 
idx_01 = find(p<.01); 
a(idx_05) = strrep(a(idx_05),' ','* '); 
a(idx_01) = strrep(a(idx_01),'* ','**'); 
a = reshape(a,size(r)); 
toc 

Прошедшее время 9.968568 секунд.

+0

Профилировщик говорит, что большая часть времени проводится в команде 'strcat', поэтому попробуйте посмотреть в этом направлении. –

ответ

1

Поскольку проблема, кажется, находится в strcat -команде, мы можем найти альтернативу для достижения того же результата. Командлет strrep, похоже, выполняется довольно быстро, поэтому давайте использовать его еще раз.

Поместите несколько дополнительных символов в строку форматирования, используемую num2str. Замените их пробелами. Таким образом, нам не нужно strcat.

a = cellstr(num2str(r(:),'%+.2fAA')); 
a = strrep(a,'AA',' '); 

Вот мои тайминги:
среднее из 10 измерений в методе (i5, 2,5 ГГц)

11.41s -> OP's code 
5.07s -> proposed solution 

Это соответствует улучшение приблизительно 44,4%.

+0

Это хороший трюк. Можно ли было бы добавить два пробела непосредственно с помощью функции num2str? почему num2str (r (:), '% +. 2f')) не работает? – mat

+0

@mat Задние и ведущие пространства обрезаются с помощью 'num2str'. Это даже при вводе в ASCII-представление с '\ x20'. – Matt

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