Проблемы с вложенными циклами for при вычислении порядка связывания для последовательных пар частиц - PullRequest
0 голосов
/ 04 августа 2020

Я написал небольшой фрагмент кода, который извлекает данные из нескольких массивов, созданных фрагментом кода, который мне прислал мой профессор. Цель состоит в том, чтобы взять параметр порядка связи bR в рабочем пространстве в паре с местоположением частицы. Отсюда я делаю то же самое с каждой другой частицей и умножаю порядки связи вместе, вычисляя расстояние между двумя частицами, местоположение берется из центрального массива. Второй вложенный для l oop усредняет выходной сигнал от всех пар частиц с одинаковым расстоянием между частицами, что дает мне функцию пространственной корреляции для конкретного решения. Проблема, с которой я сталкиваюсь, заключается в том, что у меня должно быть что-то вроде:

п (п-1) / 2 (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 Ответ

0 голосов
/ 05 августа 2020

Добро пожаловать в stackoverflow! Я заметил две проблемы:

  1. вы меняете переменные array и array2 во вложенном for-l oop, но всегда присваиваете значение одному и тому же индексу (первого l oop). Таким образом, вы получите тот же результат, если просто отрежете последний l oop и положите 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-l oop. Это может привести к нежелательному поведению, так как они net сбрасываются после завершения вложенного for-l oop. Однако это всего лишь умозрительная недоработка;)
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...