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
Antwort
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.
Oder 'F (:, 1). * (Prod (F (:, 2), 1) ./ F (:, 2))' vektorisiert. – Divakar
@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
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
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
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
@Divakar Absolut. Korrigiert. – nightcod3r