我有一组大约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
答案 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}}