0

我写了一小段代码,它从几个数组中提取数据,这些数组是由教授发送的一段代码创建的。目标是在工作区中获取键序参数bR,并与粒子的位置配对。从这里我对所有其他粒子做同样的事情,并将键阶相乘,同时计算两个粒子之间的距离,位置取自中心阵列。第二个嵌套的 for 循环对所有粒子对的输出进行平均,粒子之间的距离相同,这为我提供了特定解决方案的空间相关函数。我遇到的问题是我应该有一些类似的东西:

n(n-1)/2 (n 是粒子数),

完全不同的粒子对(顺序无关紧要),但我只得到 n。这导致当我应该有几千个我可以绘制的时候,我只能得到一个总输出。我以前的编码经验是在 c/c++ 中,我担心我编写了一些不能转换为 Matlab 的 c 风格的东西。如果有人可以给我一个健全的检查或一些更好的编码建议,我将不胜感激。

在此处输入图像描述

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
4

1 回答 1

0

欢迎来到堆栈溢出!我发现了两个问题:

  1. 您正在更改变量arrayarray2在嵌套的 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
  1. 变量numeratordenominator在两个循环之外进行初始化,并在嵌套的 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
于 2020-08-05T05:27:23.527 回答