这是我的问题陈述:
我有一个指定尺寸的立方体。随着时间的推移,在这个立方体中会产生一些球。我已经模拟了坐标(x,y,z位置),生成时间和球的大小。现在我需要找到重叠球的最短路径,将立方体的上侧连接到下方并找到完成此路径的时间。
我现在想到的是找到所有点之间的欧氏距离和球半径的总和。然后将距离与总和进行比较以找到重叠矩阵。然后找到顶部的所有对象,其z大小小于0且z +大小大于多维数据集的深度,然后我应该找到路径。 我提前感谢任何帮助和想法。
例如,考虑以下数据和我迄今为止开发的代码:
offspr_x = [1 3 5 1 2]
offspr_y = [3 3 1 8 2]
offspr_z = [1 4 5 3 2]
size = [2 1 4 6 3]
time = [2 5 6 3 8]
Pos= [offspr_x' offspr_y' offspr_z']
dd=pdist(Pos,'euclidean')
ddm = squareform(dd)
% compute similar matrix based on sum of object sizes (assumes size is radius)
drad = meshgrid(size)+ meshgrid(size)';
dadj = ddm.*(ddm <= drad);
现在我需要将重叠矩阵转换为图形对象,并尝试找到offspr_z-size&lt;这些点之间的最短路径。 0(顶部的所有对象的z大小小于0)和offspr_z + size&gt; 5(底部的对象的z +大小大于5):
starts = find(offspr_z-size < 0)
ends = find(offspr_z+size > 5)
更新:正如@beaker建议的那样,我也尝试了Floyd-Warshall,这里是我使用的代码:
function D = FastFloyd(D)
n = size(D, 1);
for k=1:n
i2k = repmat(D(:,k), 1, n);
k2j = repmat(D(k,:), n, 1);
D = min(D, i2k+k2j);
end
end
因此,对于:
dadj(dadj==0)=Inf
D = FastFloyd(dadj)
我得到了以下结果:
D =
3.4641 4.1815 6.0000 5.3852 1.7321
4.1815 4.8990 3.0000 5.4772 2.4495
6.0000 3.0000 6.0000 8.3066 4.3589
5.3852 5.4772 8.3066 10.7703 6.1644
1.7321 2.4495 4.3589 6.1644 3.4641
但我需要在开始和结束向量之间找到最短(最快)的路径(那些与立方体的上下表面重叠的点)。我说最快,因为我对最小的距离不感兴趣,但是在最短的时间内......
答案 0 :(得分:0)
你有个好的开始:
offspr_x = [1 3 5 1 2]
offspr_y = [3 3 1 8 2]
offspr_z = [1 4 5 3 2]
size = [2 1 4 6 3]
time = [2 5 6 3 8]
Pos= [offspr_x' offspr_y' offspr_z']
dd=pdist(Pos,'euclidean')
pdist
为您提供距离矢量。要将其更改为可识别的内容,请使用squareform
:
ddm = squareform(dd)
现在我们将您的计算用于半径矩阵,然后使用邻接矩阵:
% compute similar matrix based on sum of object sizes (assumes size is radius)
drad = meshgrid(size)+ meshgrid(size)';
adj = ddm.*(ddm <= drad);
这会在ddm
中找到小于其各自半径距离的值,并将其用作蒙版以从ddm
获取值。
以下是测试用例的输出:
adj =
0.00000 0.00000 6.00000 5.38516 1.73205
0.00000 0.00000 3.00000 5.47723 2.44949
6.00000 3.00000 0.00000 8.30662 4.35890
5.38516 5.47723 8.30662 0.00000 6.16441
1.73205 2.44949 4.35890 6.16441 0.00000