假设我有一组非重复的十进制数:
v1 = 0.0588235294117647, 0.1428571428571429, 0.0526315789473684, 0.0769230769230769
我想通过将所有元素乘以/除以一个数字将其转换为整数数组:
v2 = 1729, 4199, 1547, 2261
所有数字也必须采用最简单的形式。为了澄清,这是一个带有一个自由变量的矩阵的解决方案列。我需要使该变量等于使整个列由整数组成的东西。
我尝试了很多东西,但似乎没有任何东西可以继续工作。
我需要某种类型的算法,以便我可以自动执行此过程。
答案 0 :(得分:3)
根据您对其他答案的评论,您的问题似乎是如何缩放向量,以便所有值都是整数。
这不是一件容易的事,因为您基本上需要找到v1
中所有数字的小数近似值。
相关:Algorithm for finding the ratio of two floating-point numbers?
根据您想要的数字类型,基本上有两种主要方法:
1)简单方法:您可以将向量乘以2直到所有内容都变为整数。由于所有当前系统都使用二进制浮点,因此保证会发生这种情况。这基本上是上述问题中的first answer。
这种方法有一个主要缺点。如果您的数字如下:
0.3333333333333333
0.1000000000000000
0.2500000000000000
你会得到非常“怪异”(并且可能很大)的结果。 (你不会得到:20, 6, 15
这是你想要的答案)
2)困难的方法:这种方法是在v1
的每个元素上使用continued fractions将其转换为分数数组。然后将每个元素乘以所有分母的最小公倍数。这基本上是上述问题中的second answer。
这种方法的缺点是数学密集且复杂。所以你最好只是在那个答案中复制实现。优点是它会带来更好的结果。
答案 1 :(得分:2)
如果我理解你的话,你想要做一些非常大的整数。
你想要找到一个整数(最好是可能的最小,但可能找不到很快),它是3.3837475943的倍数,称之为m1。然后这样做,所以你有m1,m2,m3,m4。然后,您希望找到它们的最低公共倍数lcm(m1, m2, m3, m4)
,或者只使用m1*m2*m3*m4
来避免计算lcm。并将结果乘以矢量v1。这将导致向量中出现大量整数(几乎总是不能够以64位存储)。
因此,您可以轻松选择上述数字:
m1 = 33837475943
m2 = 89391713934747847847
m3 = 23282781272732734
m4 = 32838723
m = m1*m2*m3*m4 //2312684250534946337531905217893260302519969924182717722
v2 = m*v1
您可能希望使用快速傅立叶变换来乘以m,因为它们非常大,您可以O(n log(n))
乘法而不是n²
,但我不知道这些数字是否足够大因为它真的有益。