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

An efficient way to perform rational addition in 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.

所以矢量化方式确实要快得多。