Я пытаюсь построить трехмерную матрицу из трех векторов, где я беру расстояние наименьших квадратов между каждым элементом каждого вектора в качестве элементов матрицы.
Например, для 3d матрицы d,
d(m,n,o)=(vec1(m)-vec2(n))^2+(vec1(m)-vec3(o))^2+(vec2(n)-vec1(o))^2
В настоящее время я делаю это с тройным циклом for:
d=zeros(N,M,O);
for o=1:O
for n=1:N
for m=1:M
d(n,m,o)=(((t(n)-r(m))^2)+((t(n)-z(o))^2)+((r(m)-z(o))^2));
end
end
end
У меня вопрос: есть ли более быстрый и умный способ сделать это, например, для 2D-версии, которую я мог бы использовать:
%for n=1:N
% for m=1:M
% d(n,m)=(t(n)-r(m))^2;
% end
%end
d=(repmat(t(:),1,M)-repmat(r(:)',N,1)).^2; %this replaces the nested for loops from above Thanks Georg Schmitz
Кто бы ни был Георг Шмитц, он придумал способ использовать repmat для замены двойных циклов for в 2d версии. Конечно, я мог бы адаптировать этот метод и заменить мой тройной цикл for одним циклом for, который повторяет метод repmat (o) несколько раз, но я чувствую, что должен быть способ сделать это без циклов.
Есть идеи? Спасибо