Я пишу программу для школы, и у меня есть вложенные циклы for, которые создают 4-мерный массив (расстояний между двумя точками с координатами (x, y) и (x', y')) как показано ниже:
pos_x=1:20;
pos_y=1:20;
Lx = length(pos_x);
Ly = length(pos_y);
Lx2 = Lx/2;
Ly2 = Ly/2;
%Distance function, periodic boundary conditions
d_x=abs(repmat(1:Lx,Lx,1)-repmat((1:Lx)',1,Lx));
d_x(d_x>Lx2)=Lx-d_x(d_x>Lx2);
d_y=abs(repmat(1:Ly,Ly,1)-repmat((1:Ly)',1,Ly));
d_y(d_y>Ly2)=Ly-d_y(d_y>Ly2);
for l=1:Ly
for k=1:Lx
for j=1:Ly
for i=1:Lx
distance(l,k,j,i)=sqrt(d_x(k,i).^2+d_y(l,j).^2);
end
end
end
end
d_x и d_y - это просто матрицы 20x20, а Lx=Ly для пробных целей. Это очень медленный и, очевидно, не очень элегантный способ сделать это. Я попытался векторизовать вложенные циклы, и мне удалось избавиться от двух внутренних циклов:
dx2=zeros(Ly,Lx,Ly,Lx);
dy2=zeros(Ly,Lx,Ly,Lx);
distance=zeros(Ly,Lx,Ly,Lx);
for l=1:Ly
for k=1:Lx
dy2(l,k,:,:)=repmat(d_y(l,:),Ly,1);
dx2(l,k,:,:)=repmat(d_x(k,:)',1,Lx);
end
end
distance=sqrt(dx2.^2+dy2.^2);
который в основном заменяет 4 цикла for выше. Я пытался уже 2 дня, но не смог найти способ векторизовать все циклы. Я хотел спросить:
- можно ли на самом деле избавиться от этих 2 петель
- если это так, я был бы признателен за любые советы и рекомендации, чтобы сделать это. До сих пор я снова пытался использовать repmat в 4-х измерениях, но вы не можете транспонировать 4-мерную матрицу, поэтому я пытался использовать permute и repmat вместе во многих различных комбинациях, но безрезультатно.
Любой совет будет принят с благодарностью.
спасибо за ответы. Извините за плохую формулировку, я в основном хочу иметь совокупность осцилляторов, равномерно расположенных на плоскости x-y. Я хочу смоделировать их связь, а функция связи зависит от расстояния между каждым осциллятором. И у каждого осциллятора есть координаты x и y, поэтому мне нужно найти расстояние между osci(1,1)
и osci(1,1),..osci(1,N),osci(2,1),..osci(N,N)...
, а затем то же самое для osci(1,2)
и osci(1,1)...osci(N,N)
и т. д. связь), если есть более простой способ сделать это, кроме использования 4-мерного массива, я бы также определенно хотел это знать.
(i,j)
— это расстояние между[x1i,y1i]
и[x2i,y2i]
? - person Jonas   schedule 16.06.2011