gpt4 book ai didi

wolfram-mathematica - 使用 Mathematica 从列表中创建矩阵

转载 作者:行者123 更新时间:2023-12-01 11:05:00 24 4
gpt4 key购买 nike

我有一个问题,我试图用 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指向我的坐标的链接,也许这有帮助。

好吧,我希望我对我的问题的解释足够好。我将不胜感激!

最佳答案

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

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

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

关于wolfram-mathematica - 使用 Mathematica 从列表中创建矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6832482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com