【发布时间】:2016-09-05 17:51:25
【问题描述】:
到目前为止我已经搜索过,我知道有几种方法(1,2,3,4)到目前为止我使用了以下代码:
Fv_calc(:,2) = arrayfun(@(n) MaxPositiveRoot2DegreePolynomial(QuadraticCoefficients(n,:)), 1:size(QuadraticCoefficients,1));
其中 MaxPositiveRoot2DegreePolynomial 是以下函数:
function root = MaxPositiveRoot2DegreePolynomial(c)
d = c./c(1);
root = eig([0 -d(3);1 -d(2)]);
condition = root == abs(root);
root = root(condition);
if isempty(root)
root = 0;
end
root = max(root);
end
其中 QuadraticCoefficients 是一个 62271x3 矩阵,每行包含一般二次方程的系数 a、b、c。 ax^2+bx+c
关于我要解决的问题,所有的根都是真实的,因此我使用了一个修改后的函数来查找根,以免浪费时间检查根是否真实。
通过分析代码,我发现函数 MaxPositiveRoot2DegreePolynomial 的每次运行大约需要 0.000047 秒,对于 62271 次运行大约需要 2.914925371 秒。但是代码
Fv_calc(:,2) = arrayfun(@(n) MaxPositiveRoot2DegreePolynomial(QuadraticCoefficients(n,:)), 1:size(QuadraticCoefficients,1));
需要 3.198597803 才能运行。所以大约 0.283672431 仅由 arrayfun 占用。我想看看有什么办法可以减少这个时间?
【问题讨论】:
-
你试过循环吗?虽然
arrayfun(及其相关的*fun系列)非常适合编写紧凑的代码,但它们会增加通常很重要的错误检查开销。基本for循环通过QuadraticCoefficients的运行时间大约是 R2015b 中arrayfun实现的一半。 -
如果你花费超过 10 分钟尝试优化需要 3 秒的东西,那么你很有可能会花费比运行它更多的时间来优化,除非你正在编写一些东西必须实时运行超优化,在这种情况下,您可能无论如何都不应该使用 Matlab。
-
你不能只使用二次公式的矢量化版本吗?
sqrt的开销必须比eig少。 -
@MatthewGunn 非常好的主意,然后我要写一个问题来帮助我决定是否使用 matlab。
-
@TroyHaskin 实际上我想 MEX gsl_poly_solve_quadratic 并使用它而不是
MaxPositiveRoot2DegreePolynomial。我问这个问题只是为了找到在矩阵的每一行上应用通用函数的最快方法
标签: performance matlab matrix vectorization