0

我有一组大约 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 填充二维 100x100 NewArray 的语法

4

2 回答 2

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 *)
于 2013-01-08T08:19:28.237 回答
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}}
于 2013-01-08T13:01:51.830 回答