【问题标题】:Speeding up program in matlabmatlab加速程序
【发布时间】:2020-08-23 05:00:15
【问题描述】:

我有两个功能:

ccexpan - 计算函数fN 节点的插值多项​​式系数,在第一类基的 Chebyshew 多项式中。

csum - 使用来自ccexpan 的系数c 计算参数t 的值(使用Clenshaw 算法)。

这是我目前所写的:

function c = ccexpan(f,N)

z = zeros (1,N+1);
s = zeros (1,N+1);

for i = 1:(N+1)
    z(i) = pi*(i-1)/N;
end

t = f(cos(z));

for k = 1:(N+1)
    s(k) = sum(t.*cos(z.*(k-1)));
    s(k) = s(k)-(f(1)+f(-1)*cos(pi*(k-1)))/2;
end

c = s.*2/N;

和:

function y = csum(t,c)

M = length(t);
N = length(c);
y = t;
b = zeros(1,N+2);

for k = 1:M
    for i = N:-1:1
        b(i) = c(i)+2*t(k)*b(i+1)-b(i+2);
    end
    y(k)=(b(1)-b(3))/2;
end

不幸的是,这些程序非常慢,而且还有些不准确。 请给我一些关于如何加快速度以及如何提高准确性的提示。

【问题讨论】:

  • 你分析过你的代码吗?
  • @AnderBiguri 不,我不知道它是什么,我是 matlab 新手。
  • 它会生成一个报告,告诉你执行时间花在哪里:mathworks.com/help/matlab/matlab_prog/…
  • @Daniel 所以报告说,csum 运行了 40 秒,ccexpan 运行了 271 秒,其中 50 秒是“自我时间”。所以我想我应该优化ccexpan
  • 该报告还允许您查看函数内部,并知道其中哪些部分需要时间。在某些时候,如果您要运行数百万次,那会很慢。

标签: performance matlab numerical-methods floating-accuracy polynomials


【解决方案1】:

尽可能避免使用循环结构。乍一看,我会放弃你的第一个 for 循环

for i = 1:(N+1)
    z(i) = pi*(i-1)/N;
end

并替换为

i=1:(N+1)
z = pi*(i-1)/N

我没有检查你其余的代码,但上面的例子肯定会加速你的代码。第二种策略是尽可能组合循环。

【讨论】:

  • 当我用这个索引索引我的矩阵时如何做到这一点?还是使用嵌套循环?您能否举一个 ccexpan 中另一个循环的示例?
  • 你能提供一个你通过的 f 和 N 的例子吗? (我假设 f 是一个函数,但不知道 f 的形式,我不确定如何为在 ccexpan 中转换第二个循环提供建议。
  • 我在问题的开头写了参数的含义——f 是一个函数,N 是一个标量
  • 你能给我一个函数 f 的例子吗? (重要的是要知道 f 是返回标量还是向量。如果它返回向量是列还是行等)
  • f 是标量,一个变量函数,例如。 f = @(x) 1/(1+15*x.*x)
【解决方案2】:

马丁,

考虑以下策略。

% create hypothetical N and f
N = 3
f = @(x) 1./(1+15*x.*x) 

% calculate z and t
i=1:(N+1)
z = pi*(i-1)/N
t = f(cos(z))

% make a column vector of k's
k = (1:(N+1))'

% do this: s(k) = sum(t.*cos(z.*(k-1)))
s1 = t.*cos(z.*(k-1))    % should be a matrix with one row for each row of k
                         % via implicit expansion
s2 = sum(s1,2)           % row sum, i.e., one value for each row of k

% do this: s(k) = s(k)-(f(1)+f(-1)*cos(pi*(k-1)))/2
s3 = s2 - (f(1)+f(-1)*cos(pi*(k-1)))/2

% calculate c
c  = s3 .* 2/N

【讨论】:

  • 我认为这会带您完成整个功能。
  • 如果这可行,请告诉我,我会清理我的整个帖子以进行整合。
  • 我不知道为什么,但不幸的是它的工作速度有点慢。
  • 另外,我已经编辑了这个问题,显然csum 使用嵌套循环更快,出于某种原因。
  • 您将需要提供/创建一个完整的可重现示例(主程序和所有功能)以进一步诊断。嵌套循环不应该更快。
猜你喜欢
  • 2013-10-19
  • 1970-01-01
  • 2013-09-02
  • 2017-09-21
  • 2015-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多