Проблемы с вложенными циклами for при вычислении порядка связывания для последовательных пар частиц
Я написал небольшой фрагмент кода, который извлекает данные из нескольких массивов, созданных фрагментом кода, который мне прислал мой профессор. Цель состоит в том, чтобы взять параметр порядка связи, bR в рабочей области, в паре с местоположением частицы. Отсюда я делаю то же самое с каждой другой частицей и умножаю порядки связи вместе, вычисляя расстояние между двумя частицами, местоположение берется из центрального массива. Второй вложенный цикл for усредняет выходные данные всех пар частиц с одинаковым расстоянием между частицами, что дает мне функцию пространственной корреляции для конкретного решения. Проблема, с которой я сталкиваюсь, заключается в том, что у меня должно быть что-то вроде:
(n - количество частиц),
всего различных пар частиц (порядок не имеет значения), но я получаю только n. Это приводит к тому, что я получаю только один общий результат, когда у меня должно быть несколько тысяч, которые я могу построить. Мой предыдущий опыт кодирования был на c/ C++, и меня беспокоит, что я написал что-то в стиле c, которое не переводится на Matlab. Если кто-нибудь может дать мне проверку работоспособности или дать несколько советов по кодированию, я был бы признателен.
load('Psi6Data'); %%pulls data from bond order six movie
neighbor_distance = 0;
desire = 0;
sz = size(centers,1)*(size(centers,1)-1)/2;
array = double.empty;
array2 = double.empty;
for j = 1:size(centers,1) %%finds Psi6_a * Psi6_b as well as the distance between the two particles
for p = (j+1):size(centers,1)
neighbor_distance = sqrt((centers(p,1)-centers(j,1))^2/(centers(p,2)-centers(j,2))^2);
desire = bR(1,j) * bR(1,p);
array(j) = desire;
array2(j) = neighbor_distance;
end
end
sz2 = size(array);
output = double.empty;
numerator = 0;
denominator = 0;
tempr = 0;
for k = 1:sz2 %% averaging to find g6r from each different instance of particle difference
tempr = array2(k);
output(k,2) = tempr;
for n = 1:sz2
if(array2(n) == tempr)
numerator = numerator + array(n);
denominator = denominator + 1;
end
end
output(k,1) = numerator/denominator;
end
1 ответ
Добро пожаловать в stackru! Я заметил две проблемы:
- вы меняете переменные
array
а такжеarray2
во вложенном цикле for, но всегда присваивает значение одному и тому же индексу (первого цикла). Таким образом, вы получите тот же результат, если просто отрежете последнюю петлю и поставитеp=size(centers,1)
.
for j = 1:size(centers,1)
for p = (j+1):size(centers,1)
...
array(j) = desire; % <<<<<<<<<<<<<<<<<<<<<<<<
array2(j) = neighbor_distance; % <<<<<<<<<<<<
end
end
- Переменные
numerator
а такжеdenominator
инициализируются вне обоих циклов и обрабатываются внутри вложенного цикла for. Это может привести к нежелательному поведению, так как они полностью сбрасываются после завершения вложенного цикла for. Однако это лишь умозрительная недоработка;)
numerator = 0;
denominator = 0;
for k = 1:sz2
for n = 1:sz2
numerator = numerator + array(n); % <<<<<
denominator = denominator + 1; % <<<<<<<<<
end
output(k,1) = numerator/denominator;
end