Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在GNU-Octave/Matlab中实现有理加法的一种有效方法_Matlab_Octave_Addition_Rational Number - Fatal编程技术网

在GNU-Octave/Matlab中实现有理加法的一种有效方法

在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

给定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, 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