Это трудно проверить без примера данных, но:
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 !!!!!!!
Добавить 4 пространства перед строками кода для хорошего форматирования. – shoelzer
Кроме того, у вас есть 'ThePolygon' и' thePolygon3'. Являются ли они разными? – shoelzer
thePolygon3 - это поворот ThePolygon. 'thePolygon3 = circshift (thePolygon, 2)' – camdroid