一种在GNU Octave/Matlab中执行有理加法的有效方法



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

因此,矢量化的方式确实要快得多。

相关内容

  • 没有找到相关文章

最新更新