使用mathematica创建列表中的矩阵

时间:2011-07-26 15:23:21

标签: 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 coordinates with ListPlot 任何人都可以给我一些建议,我怎样才能将这个图的每个点/我列表的每个x-y-(和z-)坐标填充到一个矩阵中?

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

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

1 个答案:

答案 0 :(得分:6)

此解决方案背后的基本理念是:

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

(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]

enter image description here

生成关闭点之间的差异向量,并仅保留长度为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}}

使用一个随机点作为原点,因此基矢u1u2的坐标将为整数:

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}]

enter image description here

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

偏移整数坐标,使它们全部为正,可以用作矩阵索引,然后将元素收集到矩阵中。我将坐标放在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]]]

enter image description here

修改

为了好玩,我们来看看精确整数点阵的点的偏差:

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

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

ListVectorPlot[Transpose[{lattice, delta}, {2, 1, 3}], VectorPoints -> 30]

enter image description here