Для векторизации этого вложенного цикла необходимо правильно изменить данные. Кросс-продукт может быть выполнен по определенному размеру, поэтому все, что вам действительно нужно сделать, - это преобразовать P1 ... P4 в векторы, содержащие ваши данные, хорошо упорядоченные.
Обратите внимание, что у вас есть «крестообразное» ядро для вашей работы. P1 может быть нижней частью, P3 - верхней частью, P2 - правой частью, а P4 - левой. Предполагая, что векторы х и у являются только координаты выбранных точек (TEMP), каждый из этих векторов можно представить следующим образом:
[x,y] = meshgrid(1:size(temps,1),1:size(temp,2)); % Create a sampling grid or replicate the one you have
tmp1 = x(3:end,2:end-1);
tmp2 = y(3:end,2:end-1);
tmp3 = temp(3:end,2:end-1);
P1 = [tmp1(:), tmp2(:), tmp3(:)] % Vectorization
tmp1 = x(2:end-1,3:end);
tmp2 = y(2:end-1,3:end);
tmp3 = temp(2:end-1,3:end);
P2 = [tmp1(:), tmp2(:), tmp3(:)];
tmp1 = x(1:end-2,2:end-1);
tmp2 = y(1:end-2,2:end-1);
tmp3 = temp(1:end-2,2:end-1);
P3 = [tmp1(:), tmp2(:), tmp3(:)];
tmp1 = x(2:end-1,1:end-2);
tmp2 = y(2:end-1,1:end-2);
tmp3 = temp(2:end-1,1:end-2);
P4 = [tmp1(:), tmp2(:), tmp3(:)];
V1 = P1 - P3;
V2 = P2 - P4;
CR = cross(V1,V2);
NRM = (CR(:,1).^2 + CR(:,2).^2 + CR(:,3).^2).^0.5; % norm(X) cannot be vectorized
CR = CR./NRM;
Theta, кажется, не зависит от каких-либо переменных в цикле, но acos (X) и точка (v1, v2) могут использоваться с векторизованными данными, такими же, как cross (v1, v2).
Я сомневаюсь, что вы можете получить повышение производительности от разложения функции кросс-продукта в расширении кофактора или попытаться реализовать его как некий нелинейный фильтр. Если он все еще слишком медленный, вы должны взглянуть на панель инструментов Parallel.
Надеюсь, это поможет!
Что такое 'px'? 'theta', кажется, определяется независимо от всего остального. – yohai
Каков результат, который вы пытаетесь достичь? С вложенным циклом вы, вероятно, хотите какой-то 2d-выход, но невозможно сказать, поскольку пример стоит – learnvst