在mathematica中填充数组

时间:2013-01-08 03:54:10

标签: arrays wolfram-mathematica 2d

我有一组大约500(x,y,z)的实际值。由于我需要根据它们的(x,y)坐标对值进行分类,因此我将z值剥离并存储在单独的列表中。我只剩下x,y值;我重新缩放并将它们舍入为1到100范围内的索引对。

现在我想用特定(x,y)坐标的100x100矩阵中的z值填充数组。

更准确地说,

我有一组值,例如:data = {{2.62399, 0.338057, 2.09629}, {1.8424, 0.135817, 3.21925}, {0.702257, 1.14502, 3.9335}...

我剥去了它的zvalues并将其存储在zvalues列表中:

zvalues = {2.09629, 3.21925, 3.9335....

我舍入,重新调整并创建了一个新的索引数组

indices = {{53, 7}, {37, 3}, {14, 23}...

我想创建一个新的100x100矩阵,并将zvalues放在与索引矩阵对应的坐标上

例如,在伪代码中

For (int i = 1, i < 101, i++){

NewArray(indices[i]) = zvalues[i];
}

第一次循环运行时,它应该NewArray(53,7) = 2.09629

我想知道循环索引数组的语法并用zvalues填充2维100x100 NewArray

2 个答案:

答案 0 :(得分:0)

虽然我不明白你为什么要创建一种索引数组的新方法,但这可以做你想要的:

data = {{2.62399, 0.338057, 2.09629}, {1.8424, 0.135817, 3.21925}, {0.702257, 1.14502, 3.9335}};
zvalues = {2.09629, 3.21925, 3.9335};
indices = {{53, 7}, {37, 3}, {14, 23}};

newArray[xIndex_, yIndex_]:=Take[data, Position[indices, {xIndex, yIndex}][[1, 1]]][[1, 3]]

newArray[53, 7]
(* 2.09629 *)

答案 1 :(得分:0)

按照基本方法初始化数组:

newArray=Table[,{100},{100}]

然后在循环中语法为:

newArray[[indices[[i,1]],indices[[i,2]]]]=zdata[[i]]

注意用于引用数组部分(或Mathematica术语中的列表)的双方括号

更好的方法是创建一个SparseArray,一方面不需要预先初始化,甚至不需要事先知道维度。

最后在mathematica中,您通常可以使用面向对象的方法,同时避免“do”循环:

data = {{1.5, 1.1, 1.1}, {2.2, 2.2, 2.2}, {1.01, 2.3, 1.2}};
m1 = Table[, {2}, {2}];
(m1[[Floor[#[[1]]], Floor[#[[2]]]]] = #[[3]]) & /@ data;
m1
m2 = SparseArray[ Floor[#[[1 ;; 2]]] -> #[[3]] & /@ data , Automatic,];
Normal[m2]


{{1.1, 1.2}, {Null, 2.2}}
{{1.1, 1.2}, {Null, 2.2}}