【问题标题】:Create matrix out of list with mathematica使用mathematica从列表中创建矩阵
【发布时间】:2011-10-13 12:47:46
【问题描述】:

我有一个问题,我尝试用mathematica 解决。 我有一个列表,其中包含来自位置测量的 x 和 y 坐标(以及在每个点测量的量的 z 值)。所以,我的清单从 列表={{-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 指向我的坐标的链接,也许这会有所帮助。

嗯,我希望我能很好地解释我的问题。我会非常感谢每一个帮助!

【问题讨论】:

  • 如果你能提供数据集就好了。如果我知道了,您需要矩阵元素为z 值,并且矩阵索引应该大致对应于xy,对吧? (另外,最好不要使用以大写字母开头的变量名,以免与内置/包冲突。List 是内置的!)
  • 感谢您的快速回复。对不起列表中的大写字母,我用它来使它更好读,但没有想到冲突问题(我编辑)。好吧,我很想在这里提供数据集,但我不知道如何上传文件......对不起!因此,当我将文件发送到您的电子邮件地址时,我希望一切正常。是的,矩阵索引应该大致对应于 x 和 y。但我的目标是在每个矩阵元素中都有 (x,y,z),我不想使用我的值的插值。
  • 你想用你的矩阵做什么?
  • @partial81 您可以上传数据文件,例如到ge.tt 并包含一个链接
  • @Szabolcs 非常感谢您的电子邮件回复和您在这里的回答!你的建议很棒!经过几个小时的睡眠后,我会尝试更好地理解它;-) 也感谢上传的提示。我不知道这个页面。我再次编辑了我的问题,并提供了指向带有我的 x 和 y 坐标的文件的链接。因此,其他用户可以在他们想尝试应用您或其他人的建议时使用它们。

标签: wolfram-mathematica


【解决方案1】:

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

  • 所有点似乎都位于格子上,但它并不完全是正方形格子(它是倾斜的)
  • 所以让我们找到晶格的基向量,然后所有(大多数?)点将是基向量的近似整数线性组合
  • 沿基向量的点的整数“坐标”将是 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]

生成接近点之间的差异向量并仅保留长度约为 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}]

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

偏移整数坐标,使它们都是正数并且可以用作矩阵索引,然后将元素收集到矩阵中。我将坐标放在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 -&gt; Null 来标记缺失的元素很草率:重要的是data 不包含确切的0s。)

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]

【讨论】:

  • 找到基向量的好主意。如果您不对稀疏数组中的数据使用点,会出现什么问题? (从 iPad 写,所以没有数学可以尝试)
  • @acl,我没有花时间弄清楚它是如何工作的……我之前知道的是可以使用SparseArray[{ {row, column} -&gt; element }] 创建一个(稀疏)数组。如果elementListSparseArray 给我一个一维数组。我想这是因为SparseArray[{index, index, ...} -&gt; {element, element, ...}] 也是一个有效的语法。
  • @Sza 好奇!我在这里做了几乎同样的事情stackoverflow.com/questions/4917896/…
  • @Szabolcs 感谢您的解决方案和解释。他们真的很好!对我来说理解所有细节有点困难,因为你的代码远远超出了我的编程技能。但无论如何,我明白了这个想法并理解了很多解决方案!看来我可以根据我的真实数据很好地调整您的解决方案。再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 2020-02-05
  • 1970-01-01
  • 1970-01-01
  • 2014-06-04
相关资源
最近更新 更多