Wolfram mathematica 使用mathematica从列表中创建矩阵

Wolfram mathematica 使用mathematica从列表中创建矩阵,wolfram-mathematica,Wolfram Mathematica,我有一个问题,我想用mathematica来解决。 我有一个从位置测量得到的x和y坐标的列表(还有在每个点测量的数量的z值)。所以,我的清单以 列表={-762.369109.998,0.915951},{-772.412109.993,0.923894},{-777.39,109.998,0.918108},…}(x,y,z)。 出于某些原因,我必须将所有这些x、y和z值填充到一个矩阵中。如果每个y坐标都有相同数量的x坐标(比如80),那么这将很容易,然后我可以使用分区[list,80],它生

我有一个问题,我想用mathematica来解决。 我有一个从位置测量得到的x和y坐标的列表(还有在每个点测量的数量的z值)。所以,我的清单以 列表={-762.369109.998,0.915951},{-772.412109.993,0.923894},{-777.39,109.998,0.918108},…}(x,y,z)。 出于某些原因,我必须将所有这些x、y和z值填充到一个矩阵中。如果每个y坐标都有相同数量的x坐标(比如80),那么这将很容易,然后我可以使用分区[list,80],它生成一个包含80列的矩阵(以及一些行,其数量由具有相同值的y坐标的数量给出)。
不幸的是,这并不是那么容易,每个y的x坐标数并不是严格恒定的,从所附的列表图中可以看出。 有谁能给我一些建议,我怎样才能把这个图的每个点/列表中的每个x-y-(和z-)坐标填入一个矩阵

为了更好地解释我想要什么,我在附图中指出了一个矩阵。在那里人们可以看到,我的图中几乎每个点都会落入矩阵的一个单元格中,只有一些单元格会保持为空。 我在绘图中使用红色表示列表中x坐标上升的点,蓝色表示列表中x坐标下降的点(位置沿弯曲线测量)。也许这种顺序可以用来解决这个问题。。。 链接到我的坐标,也许这会有帮助


嗯,我希望我对我的问题解释得足够好。我将非常感谢您的帮助

此解决方案的基本思想是:

  • 所有的点似乎都位于一个晶格上,但它并不完全是一个正方形晶格(它是倾斜的)
  • 让我们找到晶格的基向量,那么所有(大多数?)点都是基向量的近似整数线性组合
  • 沿基向量的点的整数“坐标”将是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 &
     ];
使用一个随机点作为原点,因此沿基向量
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}]
让我们找到整数坐标,看看它们有多好(它们离实际整数有多远):

所有点都接近整数近似值

偏移整数坐标,使其全部为正,并可用作矩阵索引,然后将元素聚集到矩阵中。我将坐标放在一个
对象中,以免混淆
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}
最后我们得到一个矩阵
结果
,其中每个元素都是一个坐标对!(我在这里草率地做了
0->Null
来标记缺少的元素:重要的是
data
不包含精确的
0
s。)

编辑

为了好玩,让我们看看点与精确整数晶格点的偏差:

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

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

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

如果您能提供数据集,那就太好了。如果我得到它,你需要矩阵元素是
z
值,矩阵索引应该大致对应于
x
y
,对吗?(另外,最好不要使用以大写字母开头的变量名,以避免与内置名/包冲突。
List
是内置名!)感谢您的快速回复。很抱歉列表中的大写字母,我用它来提高可读性,但没有考虑冲突问题(我编辑)。嗯,我想在这里提供数据集,但我不知道如何上传文件。。。很抱歉因此,我希望它是好的,当我发送一个文件到您的电子邮件地址。是的,矩阵索引应该大致对应于x和y。但我的目标是在每个矩阵元素中都有(x,y,z),我不想使用插值。你想对你的矩阵做什么?@partial81你可以上传数据文件,例如,到link@Szabolcs非常感谢您的电子邮件回复和您的回答!你的建议很好!睡了几个小时后,我会努力更好地理解它;-)也感谢上传的提示。我不知道这一页。我再次编辑了我的问题,并提供了一个带有我的x坐标和y坐标的文件链接。所以其他用户可以在他们想应用你或其他人的建议时使用它们。找到基向量的好主意。如果不使用稀疏数组中的数据点,会出现什么中断?(在iPad上写作,所以没有mathematica可以尝试)@acl,我没有花时间去弄清楚它到底是如何工作的。。。我以前知道的是,可以使用
SparseArray[{{row,column}->element}]
创建(稀疏)数组。如果
元素
是一个
列表
SparseArray
会给我一个1D数组。我想这是因为
SparseArray[{index,index,…}->{element,element,…}]
也是一种有效的语法。@Sza好奇!我在这里做了几乎相同的事情@Szabolcs谢谢你的解决方案和解释。他们真的很好!对我来说,理解所有细节有点困难,因为你的代码远远超出了我的编程技能。但无论如何,我有了这个想法,并且理解了很多解决方案!看来我能很好地使您的解决方案适应我的真实数据。再次感谢你!
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]