<p>如果您不介意由于舍入而产生的不同值,我可以对您进行压缩。在</p>
<pre><code>from math import pi, sin
interval=2*pi/1024
sinval=lambda i:int(round(sin(i*interval)*36))+50
</code></pre>
<p>下面的代码可以实际执行您想做的事情;它与</p>
^{pr2}$
<p>作为测试数据。如果在第一列中有索引,则需要在<code>for</code>循环中切换<code>val</code>和{<cd2>}的顺序。在</p>
<pre><code>ranges, oldval, oldidx = [[0, 0]], 0, 0
for val, index in vals:
if not (val == oldval and index == oldidx + 1):
ranges[-1].append(oldidx)
ranges.append([val, index])
oldval, oldidx = val, index
ranges[-1].append(oldidx)
ranges.pop(0)
ifs = ('if((index >= {1}) and (index <= {2})) return {0};\n'.format(val, start, end)
for val, start, end in ranges)
print ''.join(ifs)
</code></pre>
<p>编辑:哎呀,我漏了一行。固定的。另外,你的乘数实际上是36而不是35,我一定是在脑子里把(14,86)四舍五入到(15,85)。在</p>
<p>编辑2:演示如何只存储表的四分之一。在</p>
<pre><code>from math import pi, sin
full = 1024
half = 512
quarter = 256
mag = 72
offset = 50
interval = 2 * pi / full
def sinval(i):
return int(round(sin(i * interval) * (mag // 2))) + offset
vals = [sinval(i) for i in range(quarter)]
def sintable(i):
if i >= half + quarter:
return 2 * offset - vals[full - i - 1]
elif i >= half:
return 2 * offset - vals[i - half]
elif i >= quarter:
return vals[half - i - 1]
else:
return vals[i]
for i in range(full):
assert -1 <= sinval(i) - sintable(i) <= 1
</code></pre>
<p>如果从表中减去偏移量,只需将前两个<code>-vals[...]</code>改为。在</p>
<p>另外,底部的比较是模糊的,因为我得到了72比1的错误。这只是因为你的值被四舍五入为整数;它们都是介于两个值中间的地方,所以准确度几乎没有下降。在</p>