2016-04-05 2 views
1

Учитывая F, матрицу фракций nx2 ([num1, den1; num2, den2; ...]), как эффективно вычислить фракцию, которая является результатом их добавления? (то есть [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)]). Результат не должен быть в неприводимой форме, точка - эффективность (значение векторизованное, а не код C).Эффективный способ выполнения рационального добавления в GNU Octave/Matlab

+0

Для больших умножений ваш метод может превышать диапазон 2^52, что приведет к неточным результатам. Может ли использовать 'lcm' для получения меньших значений? – Daniel

+2

Если 'F' является' nx2', не должно быть '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) 'вместо этого? – Divakar

+0

@ Дивакар Абсолютно. Исправленный. – nightcod3r

ответ

3

Вы можете использовать arrayfun применить функцию к массиву, и prod принимать продукт

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

Тогда ваш ответ

[sum(G), p] 

или вы можете сделать это в векторизованного, как Дивакар предложил в качестве

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

Я тестировал как на массиве 50x2 со 100 0 попыток и результаты были

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

Таким образом, векторизованный способ намного быстрее.

+5

Или 'F (:, 1). * (Prod (F (:, 2), 1) ./ F (:, 2))' в векторном виде. – Divakar

+0

@Divakar Этот новый пункт не имеет сущности, чтобы поднять новый вопрос, поэтому я даю ему попробовать: наличие индекса F в качестве матрицы mxk I, где F (I (:, j):) являются дробями для суммы для каждого столбца I. Как вычислить сумму всех групп т-фракций в векторном виде? [prodfrac (F (I (:, 1), :)), ..., prodfrac (F (I (:, k), :))] (где prodfrac - это решение, предложенное выше Sbte) – nightcod3r

+1

Что-то вроде этого ? 'F1 = изменить форму (F (l, 1), размер (l, 1), размер (l, 2)); F2 = изменение формы (F (l, 2), размер (l, 1), размер (l, 2)); G = F1 ./ F2 * diag (prod (F2)); [sum (G) ', prod (F2)'] '. Обратите внимание, что 'diag' здесь, вероятно, медленный, поэтому вы можете использовать' spdiags' вместо этого. – Sbte

Смежные вопросы