2016-04-05 8 views
1

Gegeben F, eine nx2 Matrix von Brüchen ([num1, den1; num2, den2; ...]), wie man den Bruchteil, der aus ihrer Addition resultiert, effizient berechnet? (d. h. [F(1,1)*F(2,2)*...*F(n,2) + F(1,2)*F(2,1)*F(2,3)*...*F(n,2) + ... , F(1,2)*...*F(n,2)]). Das Ergebnis muss nicht irreduzibel sein, der Punkt ist Effizienz (also vektorisiert, nicht C-Code).Ein effizienter Weg zur rationalen Addition in GNU Octave/Matlab

+0

Bei großen Multiplikationen kann Ihre Methode den Bereich von 2^52 überschreiten, was zu ungenauen Ergebnissen führen kann. Verwenden Sie 'lcm', um kleinere Werte zu erhalten? – Daniel

+2

Wenn 'F'' nx2' ist, sollte das nicht 'F (1,1) * F (2,2) * F (3,2) ... * F (n, 2) + F (2 , 1) * F (1,2) * F (3,2) ... * F (n, 2) + ... F (n, 1) * F (1,2) * F (2, 2) ... * F (n-1,2) 'stattdessen? – Divakar

+0

@Divakar Absolut. Korrigiert. – nightcod3r

Antwort

3

Sie können arrayfun verwenden, um eine Funktion auf ein Array anwenden, und prod das Produkt zu nehmen

p = prod(F(:,2)); 
G = arrayfun(@(x, y) x * p/y, F(:,1), F(:,2)); 

Dann ist Ihre Antwort

[sum(G), p] 

oder Sie können es in einem vektorisierten Weise tun, wie Divakar vorgeschlagen als

p = prod(F(:,2)); 
G = F(:,1).*(p./F(:,2)); 
[sum(G), p] 

Ich testete beide auf einem 50x2-Array mit 100 0 Versuche und die Ergebnisse waren

Elapsed time is 0.594867 seconds. 
Elapsed time is 0.012170 seconds. 

So ist in der Tat der vektorisierte Weg viel schneller.

+5

Oder 'F (:, 1). * (Prod (F (:, 2), 1) ./ F (:, 2))' vektorisiert. – Divakar

+0

@Divakar Dieser neue Punkt hat nicht die Entität, um eine neue Frage zu stellen, also versuche ich es hier: Einen Index zu F als mxk Matrix I haben, wobei F (I (:, j),:) sind die Brüche für jede Spalte von I. Wie berechnet man die Summe aller Gruppen von m Brüchen in einer vektorisierten Weise? [prodfrac (F (I (:, 1), :)), ..., prodfrac (F (I (:, k), :))] (wobei prodfrac die oben von Sbte vorgeschlagene Lösung ist) – nightcod3r

+1

So etwas Ähnliches ? F1 = Umformen (F (l, 1), Größe (l, 1), Größe (l, 2)); F2 = Umformen (F (l, 2), Größe (l, 1), Größe (l, 2)); G = F1./F2 * diag (prod (F2)); [Summe (G) ', Prod (F2)'] '. Beachten Sie, dass "diag" hier wahrscheinlich langsam ist, so dass Sie stattdessen "spdiags" verwenden sollten. – Sbte