在GNU-Octave/Matlab中实现有理加法的一种有效方法
给定F,一个分数的nx2矩阵(在GNU-Octave/Matlab中实现有理加法的一种有效方法,matlab,octave,addition,rational-number,Matlab,Octave,Addition,Rational Number,给定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代码)。您可以使用arrayfun将函数应用于数组,并使用prod获取产品 p = prod(F(:,2)); G = arrayfun(@(x, y) x * p / y
[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代码)。您可以使用arrayfun
将函数应用于数组,并使用prod
获取产品
p = prod(F(:,2));
G = arrayfun(@(x, y) x * p / y, F(:,1), F(:,2));
那么你的答案是
[sum(G), p]
或者你也可以像Divakar建议的那样用矢量化的方式来做
p = prod(F(:,2));
G = F(:,1).*(p./F(:,2));
[sum(G), p]
我在50x2阵列上进行了1000次测试,结果是
Elapsed time is 0.594867 seconds.
Elapsed time is 0.012170 seconds.
因此,矢量化方法确实要快得多。对于大的乘法,您的方法可能会超出2^52的范围,这将导致不准确的结果。可能使用
lcm
来获得更小的值?如果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绝对正确。更正。或F(:,1)。*(prod(F(:,2),1)。/F(:,2))
以矢量化的方式。@Divakar这个新点没有提出新问题的实体,所以我在这里尝试一下:将F的索引作为m x k矩阵I,其中F(I(:,j),:)是I的每一列要求和的分数。如何以向量化的方式计算所有m组分数的和?[prodfrac(F(I(:,1),:),…,prodfrac(F(I(:,k),:)](其中,prodfrac是Sbte提出的上述解决方案)类似的内容<代码>F1=重塑(F(l,1),尺寸(l,1),尺寸(l,2));F2=重塑(F(l,2),尺寸(l,1),尺寸(l,2));G=F1./F2*diag(产品(F2));[总和(G)”,产品(F2)”。请注意,此处的diag
速度可能较慢,因此您可能需要使用spdiags
。