我正在制作一个需要3个输入参数(作为浮点数)的数学模型 - 比方说j,j0和j1。 'j0'是主要变量;对于每个j0,有多个j值。对于每个j,有多个j1值。因此,我使用嵌套的'do'循环来生成我的数据。
Do[
Do[
Do[
(*some functions here*)
,{j1,j1Start,j1End,angleIncrement}](*Close the j1 'do' loop.*),
{j,jStart,jEnd,angleIncrement}](*Close the j 'do' loop.*),
{j0,j0Start, j0End,angleIncrement}(*Close the j0 'do' loop.*)]
现在我的模型变得非常大,所以我试图创建结果的“查找表”。有很多结果。对于我编写的每几个(几十个)函数,我必须遍历(如上所示),进行一些计算,并记录对应于输入j0,j,j1值的每个特定组合的结果。(输入参数不是整数,不一定是均匀间隔,结果肯定也不是。)
我所做的'查找表'基本上是数组:
arrayname[inputVar1a,inputVar2a,inputVar3a] = {result1a,result2a}
arrayname[inputVar1b,inputVar2b,inputVar3b] = {result1b,result2b} etc.
实际上,3个输入参数被输入到函数中,结果被附加到数组中 - 删除了再次使用函数的要求。
然而,我发现,Mathematica不喜欢我正在做的事情(或者我是如何做的。)这是一段显示我一直在做的事情的代码: Do[(*Initialise the j0 'do' loop.*)
Do[(*Initialise the j 'do' loop.*)
Do[(*Initialise the j1 'do' loop.*)
entryPoint[j0, j, j1] = {}(*Initialise the array.*);
If[j == 270,
AppendTo[
entryPoint[j0, j, j1],(*Result of other function here*)] &&
AppendTo[entryPoint[j0, j, j1],(*Result of other function here*)]
](*Close the'if' loop.*),
{j1, zMaxMinResults[j0, j][[1]], zMaxMinResults[j0, j][[2]],
zAngleIncrement [j0, j][[1]]}(*Loop across j1.*)
](*Close the j1 'do' loop.*),
{j, jStart, jEnd, angleIncrement}(*Loop across j.*)
](*Close the j 'do' loop.*),
{j0, j0Start, j0End, angleIncrement}(*Loop across j0.*)
](*Close the j0 'do' loop.*)
当我想调用结果时,我使用Part [expr,i]或[[i]]如下。 这是一些数据(只有2个输入参数而不是3个)。
zMaxMinResults[22.5,319.]={-49.711,-49.}
zMaxMinResults[22.5,319.5]={-50.211,-49.5}
zMaxMinResults[22.5,320.]={-50.711,-50.}
zMaxMinResults[22.5,320.5]={-51.211,-50.5}
zMaxMinResults[22.5,321.]={-51.711,-51.}
zMaxMinResults[22.5,321.5]={-52.211,-51.5}
以下是我如何引用它。
In[102]:=
zMaxMinResults[22.5, 319.]
zMaxMinResults[22.5, 319.][[1]]
Part[zMaxMinResults[22.5, 319.], 1]
zMaxMinResults[22.5, 319.][[2]]
Part[zMaxMinResults[22.5, 319.], 2]
Out[102]= {-49.711, -49.}
Out[103]= -49.711
Out[104]= -49.711
Out[105]= -49.
Out[106]= -49.
但是,通常,引用代码[1]等会返回第1,第2或第3个输入参数。例如。
x2[22.5,167.,102.371]={2908.02,5892.49}
In[119]:=
x2[22.5, 319., 102.371]
x2[22.5, 319., 102.371][[1]]
Part[x2[22.5, 319., 102.371], 1]
x2[22.5, 319., 102.371][[2]]
Part[x2[22.5, 319., 102.371], 2]
Out[119]= x2[22.5, 319., 102.371]
Out[120]= 22.5
Out[121]= 22.5
Out[122]= 319.
Out[123]= 319.
你会看到代码返回错误的数字 - 输入变量的值。最后,这是一段独立的代码,它表现出相同的排序行为。
我是我不应该以这种方式生成或填充数组,非常感谢这里的任何帮助! :)
答案 0 :(得分:0)
说明我在评论中所说的内容,我怀疑你看到的是这样的事情:
Clear[g];
i = 0.; Do[ g[i] = i ; i += .01 , { 101}]
{g[0.], g[.1], g[.5], g[1.]}
{0。,0.1,g [0.5],g [1。]}
这里的问题是价值" 0.01"不能用二进制精确表示,所以你有一个错误累积。分配的最后一个g
索引实际上是:
g[1.0000000000000007`]
1
一个解决方法是做这样的事情:
Clear[g];
i = 0.; Do[ g[i] = i ; i = Round[i + .01, .01] , { 101}]
{g[0.], g[.1], g[.5], g[1.]}
{0。,0.1,0.5,1。}
交替使用mathematica,如果你使用浮点do循环增量,那么你就可以进行舍入,所以这可行:
Clear[g];
Do[ g[i] = i , { i, 0, 1, .01}]
{g[0.], g[.1], g[.5], g[1.]}
{0。,0.1,0.5,1。}
请注意,如果您通过某种计算得出指数,则会出现同样的问题,因此最好不要这样做。