我有一个问题,我尝试使用mathematica解决。 我有一个列表,其中包含来自位置测量的x和y坐标(以及在每个点测量的数量的z值)。所以,我的清单开头 list = {{ - 762.369,109.998,0.915951},{ - 772.412,109.993,0.923894},{ - 777.39,109.998,0.918108},...}(x,y,z)。 出于某些原因,我必须将所有这些x,y和z值填充到矩阵中。如果我为每个y坐标设置相同数量的x坐标(比方说80),那就很容易了,那么我可以使用Partition [list,80]生成一个包含80列的矩阵(以及一些给出数字的行)通过具有相同值的y坐标的数量) 不幸的是,它并不那么容易,每个y的x坐标数不是严格恒定的,从附加的ListPlot可以看出。 任何人都可以给我一些建议,我怎样才能将这个图的每个点/我列表的每个x-y-(和z-)坐标填充到一个矩阵中?
为了更好地解释我想要的东西,我在附图中指出了一个矩阵。可以看出,我的情节中的几乎每个点都会落入矩阵的单元格中,只有一些单元格会保持空白。 我在图中使用的颜色为红色,其中x坐标在我的列表中上升,而蓝色则用于x坐标在我的列表中下降的点(位置沿曲折线测量)。或许这种顺序可以解决问题... Here我的坐标链接,也许这有帮助。
嗯,我希望我能够很好地解释我的问题。我非常感谢你的帮助!
答案 0 :(得分:6)
此解决方案背后的基本理念是:
(OP通过电子邮件向我发送了数据文件。它由{x,y}
点坐标组成。)
读入数据:
data = Import["xy.txt", "Table"];
找到距离每个点最近的4个点,并注意它们在水平和垂直方向上相距5个距离:
nf = Nearest[data];
In:= # - data[[100]] & /@ nf[data[[100]], 5]
Out= {{0., 0.}, {-4.995, 0.}, {5.003, 0.001}, {-0.021, 5.003}, {0.204, -4.999}}
ListPlot[nf[data[[100]], 5], PlotStyle -> Red,
PlotMarkers -> Automatic, AspectRatio -> Automatic]
生成关闭点之间的差异向量,并仅保留长度为5的那些:
vv = Select[
Join @@ Table[(# - data[[k]] & /@ nf[data[[k]], 5]), {k, 1, Length[data]}],
4.9 < Norm[#] < 5.1 &
];
将矢量按其可指向的方向平均,并保持两个“好”的(指向“向上”或“向右”)。
In:= Mean /@ GatherBy[vv, Round[ArcTan @@ #, 0.25] &]
Out= {{0.0701994, -4.99814}, {-5.00094, 0.000923234}, {5.00061, -4.51807*10^-6},
{-4.99907, -0.004153}, {-0.0667469, 4.9983}, {-0.29147, 4.98216}}
In:= {u1, u2} = %[[{3, 5}]]
Out= {{5.00061, -4.51807*10^-6}, {-0.0667469, 4.9983}}
使用一个随机点作为原点,因此基矢u1
和u2
的坐标将为整数:
translatedData = data[[100]] - # & /@ data;
让我们找到整数坐标,看看它们有多好(它们与实际整数的距离):
In:= integerIndices = LinearSolve[Transpose[{u1, u2}], #] & /@ translatedData ;
In:= Max[Abs[integerIndices - Round[integerIndices]]]
Out= 0.104237
In:= ListPlot[{integerIndices, Round[integerIndices]}, PlotStyle -> {Black, Red}]
所有点都接近整数近似值。
偏移整数坐标,使它们全部为正,可以用作矩阵索引,然后将元素收集到矩阵中。我将坐标放在point
对象中,以免混淆SparseArray
:
offset = Min /@ Transpose[Round[integerIndices]]
offset = {1, 1} - offset
result =
SparseArray[
Thread[(# + offset & /@ Round[integerIndices]) -> point @@@ data]]
result = Normal[result] /. {point -> List, 0 -> Null}
我们最终得到一个矩阵result
,其中每个元素都是一个坐标对! (我在这里草率地做0 -> Null
以标记缺失的元素:data
包含没有确切的0
s重要。)
MatrixForm[result[[1 ;; 10, 1 ;; 5]]]
修改强>
为了好玩,我们来看看精确整数点阵的点的偏差:
lattice = #1 u1 + #2 u2 & @@@ Round[integerIndices];
delta = translatedData - lattice;
delta = # - Mean[delta] & /@ delta;
ListVectorPlot[Transpose[{lattice, delta}, {2, 1, 3}], VectorPoints -> 30]