使用mathematica创建列表中的矩阵

par*_*l81 3 wolfram-mathematica

我有一个问题,我尝试用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可以看出. xy与ListPlot坐标 任何人都可以给我一些建议,我怎样才能将这个图的每个点/我列表的每个xy-(和z-)坐标填充到一个矩阵中?

为了更好地解释我想要的东西,我在附图中指出了一个矩阵.可以看出,我的情节中的几乎每个点都会落入矩阵的单元格中,只有一些单元格会保持空白.我在图中使用的颜色为红色,其中x坐标在我的列表中上升,而蓝色则用于x坐标在我的列表中下降的点(位置沿曲折线测量).也许这种顺序可以解决问题... 这里有我的坐标的链接,也许这有帮助.

好吧,我希望我能够很好地解释我的问题.我非常感谢你的帮助!

Sza*_*lcs 6

该解决方案背后的基本思想是:

  • 所有点似乎都位于一个格子上,但它并不是一个正方形格子(它是倾斜的)
  • 所以让我们找到格子的基矢量,然后所有(大多数?)点将是基矢量的近似整数线性组合
  • 沿基矢量的点的整数"坐标"将是OP矩阵的矩阵索引

(OP通过电子邮件发送了数据文件.它由{x,y}点坐标组成.)

读入数据:

data = Import["xy.txt", "Table"];
Run Code Online (Sandbox Code Playgroud)

找到每个点最近的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]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

生成关闭点之间的差异向量,并仅保留大约5的长度:

vv = Select[
      Join @@ Table[(# - data[[k]] & /@ nf[data[[k]], 5]), {k, 1, Length[data]}], 
      4.9 < Norm[#] < 5.1 &
     ];
Run Code Online (Sandbox Code Playgroud)

将矢量按其可指向的方向平均,并保持两个"好"的(指向"向上"或"向右").

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}}
Run Code Online (Sandbox Code Playgroud)

使用一个随机点为原点,所以沿基向量的坐标u1u2将整数:

translatedData = data[[100]] - # & /@ data;
Run Code Online (Sandbox Code Playgroud)

让我们找到整数坐标,看看它们有多好(它们与实际整数有多远):

In:= integerIndices = LinearSolve[Transpose[{u1, u2}], #] & /@ translatedData ;

In:= Max[Abs[integerIndices - Round[integerIndices]]]

Out= 0.104237

In:= ListPlot[{integerIndices, Round[integerIndices]}, PlotStyle -> {Black, Red}]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

所有点都接近整数近似值.

偏移整数坐标,使它们全部为正,可以用作矩阵索引,然后将元素收集到矩阵中.我把坐标放在一个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}
Run Code Online (Sandbox Code Playgroud)

我们终于有了一个矩阵result,每个元素都是一个坐标对!(我在0 -> Null这里做的很草率以标记缺失的元素:重要的是不data包含精确的0s.)

MatrixForm[result[[1 ;; 10, 1 ;; 5]]]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

编辑

只是为了好玩,让我们看一下精确整数网格点的偏差:

lattice = #1 u1 + #2 u2 & @@@ Round[integerIndices];

delta = translatedData - lattice;
delta = # - Mean[delta] & /@ delta;

ListVectorPlot[Transpose[{lattice, delta}, {2, 1, 3}], VectorPoints -> 30]
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述