2013-05-08 2 views
0

У меня есть следующий цикл в своем коде Matlab Я хотел бы избавиться:векторизации в нескольких измерениях

for i=1:size(thePolygon,3)    
    activeValues(:,i) = sum(normalVectors.*thePolygon(:,:,i),2); 
    checkValues(:,i) = sign(activeValues(:,i)-sum(normalVectors.*thePolygon3(:,:,i),2)); 
end 

Я попытался заменить i с 1:size(thePolygon,3), но размеры не выстраиваются в линию для поэтапное умножение, и я не уверен, что еще попробовать. Заранее благодарим за любые советы.

+1

Добавить 4 пространства перед строками кода для хорошего форматирования. – shoelzer

+0

Кроме того, у вас есть 'ThePolygon' и' thePolygon3'. Являются ли они разными? – shoelzer

+0

thePolygon3 - это поворот ThePolygon. 'thePolygon3 = circshift (thePolygon, 2)' – camdroid

ответ

0

Это трудно проверить без примера данных, но:

activeValues = squeeze(sum(bsxfun(@times, normalVectors, thePolygon), 2)) 

ИТАК первые несколько тестовых данных:

a = rand(3,3,3); 
b = rand(3,3); 

Сейчас мы тестируем Yours

for i=1:size(a,3) 
    c(:,i) = sum(b.*a(:,:,i),2); 
end 

на моем счете я получил :

c = 

    0.9773 1.0608 0.3673 
    0.6670 0.1597 0.7296 
    0.8372 1.1418 0.9828 

и теперь моя:

squeeze(sum(bsxfun(@times, b, a), 2)) 

Я получаю

ans = 

    0.9773 1.0608 0.3673 
    0.6670 0.1597 0.7296 
    0.8372 1.1418 0.9828 

так я предполагаю, что у меня это правильно.

Пояснение:

bsxfun(@times, b, a) делает вещание, он расширяет b вдоль его одноточечное измерение (в данном случае тусклым 3), чтобы соответствовать размеру a, а затем применяет функцию (@times просто .*) поэлементно к расширено b и a. Это идентично (но лучше практика и быстрее) к обходу repmat(b, [1 1 size(a,3)]).*a.

Затем мы суммируем этот размер столбца 3D-матрицы, как и у вас, то есть sum(x, 2), который возвращает результат 1x3x3. Но я хочу получить результат 3x3, чтобы избавиться от размера singelton (т. Е. Dim 1, когда он равен 1). Я использовал squeeze

Для вас теперь тривиально прорисовывать вторую линию так же, как и вы.

НО

tic; for k = 1:10000 c = squeeze(sum(bsxfun(@times, b, a), 2)); end; toc 
Elapsed time is 0.394828 seconds. 

tic; c = zeros(3,3); for k = 1:10000 for i=1:size(a,3) 
c(:,i) = sum(b.*a(:,:,i),2); 
end; end; toc 
Elapsed time is 0.113199 seconds. 

НЕРАСПРОСТРАНЕНИЕ-векторизованная КОД быстре В MATLASB 2012b !!!!!!!

+1

Не могли бы вы объяснить это? – camdroid

+0

@camdroid Пояснение добавлено.Но будьте осторожны, это медленнее, чем цикл в новых matlabs (при условии, что вы preallocate!) – Dan

+0

@camdroid oh также я исправил ошибку, у меня был ', 2' в качестве аргумента' squeeze' вместо 'sum' before , так что просто следите за этим – Dan

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