2011-12-24 78 views
1

假设我有非重复的十进制数的数组:转向矩阵成整体整数矩阵

v1 = 0.0588235294117647, 0.1428571428571429, 0.0526315789473684, 0.0769230769230769 

我想乘以/除以所有元素将其转换为整数的数组通过单号:

v2 = 1729, 4199, 1547, 2261 

所有数字需要在其最简单的形式为好。为了澄清,这是具有一个自由变量的矩阵的解列。我需要让这个变量等于使整个列由整个整数组成的东西。

我试过一堆东西,但没有东西似乎一直工作。

我需要某种类型的算法,以便我可以自动执行此过程。

+2

我看不到这些值之间的关系。你从哪里弄到的?你是如何得到这些整数的? – duffymo 2011-12-24 02:33:10

+1

目前还不清楚'v1'和'v2'之间的关系是什么。 – 2011-12-24 02:33:30

+0

v1和v2只是简单的例子,用来分别说明我的“非重复小数矢量”和“整数矢量”的含义。我只是让他们为这个职位。对于那个很抱歉。 – 2011-12-24 02:34:37

回答

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))乘法而不是,但我不知道这些数字是否足以让它真的有益。

+0

基本上没错。然后,我想把它缩减为“最简单”的形式,这将需要统一划分一些数字。 – 2011-12-24 03:01:18

+0

@GeorgeCostanza如果您选择最小的倍数(而不是仅乘以每个数字的10次幂,并且使用结果的最小公倍数而不是'm1 * m2 * m3 * m4',那么您将得到结果。 否则你可以按照上面的方法做,然后在你的v2中找到数字的最大公约数,然后把它们全部除以 – Paulpro 2011-12-24 03:05:09

+0

@GeorgeCostanza我建议你用第二种方法,你可以使用'gcd(a,b) = gcd(b,a mod b)'用'a> b'快速找到两个数字的gcd,你需要找到n的gcd(比如你的例子中的4)大数,然后用gcd(v [1],gcd(v [2],gcd(v [3],v [4])))' – Paulpro 2011-12-24 03:07:56

3

根据您对另一个答案的评论,您的问题似乎是如何缩放向量以便所有值都是整数。

这不是一件容易的事,因为你基本上需要找到v1中所有数字的分数近似值。

相关:Algorithm for finding the ratio of two floating-point numbers?

基本上有做这取决于什么样的数字你想2种主要途径:

1)最简单的办法:你可以乘以2的载体,直到一切变成不可分割由于所有当前系统都使用二进制浮点,所以这是保证发生的。这实质上是上述问题中的first answer

这种方法有一个主要缺点。如果你的号码是这样的:

0.3333333333333333 
0.1000000000000000 
0.2500000000000000 

你会得到非常“奇怪”(可能很大)的结果。(你不会得到:20, 6, 15这是所希望的回答)

2)难的方法:此方法是使用continued fractionsv1每个元素把它变成馏分的阵列。然后将每个元素乘以所有分母的LCM。这基本上是上述问题中的second answer

这种方法的缺点是数学密集和复杂。所以你最好只是复制那个答案中的实现。好处是它会给出更好的结果。

+0

谢谢,这就是我想要的 – 2011-12-25 01:32:18

+0

如果这回答你的问题,你可以点击绿色复选标记。:) – Mysticial 2011-12-25 01:55:04