2011-12-24 44 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