在 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.
所以矢量化方式确实要快得多。
给定 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.
所以矢量化方式确实要快得多。