2016-04-05 1 views
1

Étant donné F, une matrice nx2 de fractions ([num1, den1; num2, den2; ...]), comment calculer efficacement la fraction résultant de leur addition? (c'est-à-dire [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)]). Le résultat ne doit pas être sous forme irréductible, le point est l'efficacité (signifiant vectorisé, pas le code C).Un moyen efficace d'effectuer une addition rationnelle dans GNU Octave/Matlab

+0

Pour les grandes multiplications, votre méthode peut dépasser la plage de 2^52, ce qui donnera des résultats inexacts. Peut-on utiliser 'lcm' pour obtenir des valeurs plus petites? – Daniel

+2

Si 'F' est' nx2', cela ne devrait-il pas être '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) 'à la place? – Divakar

+0

@Divakar Absolument. Corrigée. – nightcod3r

Répondre

3

Vous pouvez utiliser arrayfun pour appliquer une fonction à un tableau, et prod prendre le produit

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

Ensuite, votre réponse est

[sum(G), p] 

ou vous pouvez le faire d'une manière vectorisé comme Divakar suggéré comme

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

J'ai testé les deux sur un tableau 50x2 avec 100 0 essais et les résultats étaient

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

Donc en effet la manière vectorisée est beaucoup plus rapide.

+5

Ou 'F (:, 1). * (Prod (F (:, 2), 1) ./ F (:, 2))' de façon vectorisée. – Divakar

+0

@Divakar Ce nouveau point n'a pas l'entité pour soulever une nouvelle question, donc j'essaie ici: Avoir un index à F comme une matrice mxk I, où F (I (:, j),:) sont les fractions à additionner pour chaque colonne de I. Comment calculer la somme de tous les groupes de m fractions d'une manière vectorisée? [prodfrac (F (I (:, 1), :)), ..., prodfrac (F (I (:, k), :))] (où prodfrac est la solution proposée ci-dessus par Sbte) – nightcod3r

+1

? 'F1 = remodeler (F (l, 1), taille (l, 1), taille (l, 2)); F2 = remodelage (F (l, 2), taille (l, 1), taille (l, 2)); G = F1 ./ F2 * diag (prod (F2)); [somme (G) ', prod (F2)'] '. Notez que 'diag' ici est probablement lent, donc vous pourriez vouloir utiliser' spdiags' à la place. – Sbte