É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
Répondre
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.
Ou 'F (:, 1). * (Prod (F (:, 2), 1) ./ F (:, 2))' de façon vectorisée. – Divakar
@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
? '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
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
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
@Divakar Absolument. Corrigée. – nightcod3r