2014-09-13 3 views
0

Как ускорить выполнение следующих операций? Узкое место является третьей линией, хотя для больших размеров A1, четвертая линия довольно быстрая. Делает ли третья строка копию A (b, b), которая хранится в A1?ускорить индексирование подмассивов в Matlab?

A = randn(1000,1000); 
b = [67 145 200 185 11 166 80 137 163 132 133 19]; %random 
A1 = A(b,b); 
v=A1*A(2,b)'; 

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

v=A(b,b);*A(2,b)'; 

ответ

0

Смотрите, если это делает его быстрее в качестве замены для третьей линии, что вы утверждаете быть узким местом -

[x,y]= ndgrid(b,b); 
A1 = A((y-1)*size(A,1)+x); 

Или

A1 = A(bsxfun(@plus,(b-1)*size(A,1),b')); 

Edit: После профилирования указанными выше кодами производительность во время выполнения не выглядит доказано много. Вы упомянули в комментариях, что вы используете эти коды в цикле несколько раз и b различается. Если количество циклов было небольшим, а b было константой между этими итерациями цикла, можно было бы подумать о выполнении всех этих умножений матричных векторов по всем итерациям в одно большое умножение матричной матрицы, но здесь это не так. Поэтому я бы сказал, что на этом этапе узкое место с indexing, возможно, останется.

+0

просто попробовал 'b = randperm (200,100);' но он не работает на Matlab R2009a. Я не знаю, когда они внедрили второй параметр. – Hoki

+0

спасибо, это фактически делает его немного медленнее. Моя проблема связана с третьей строкой, только что были перестановки, поэтому я могу сформулировать свою проблему. Я специально пытаюсь ускорить третью строку, а не весь фрагмент кода. – methane

+0

@methane Вы уверены, что третья строка является узким местом? Я просто пробовал с профилировщиком MATLAB и, похоже, «randn» является виновным здесь. Не могли бы вы опубликовать скриншот результатов профилировщика? – Divakar

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