加速循环包括内置的积分命令

16个视图(30天)
Matlab脚本有以下说明:
p = 1: N
输出(2 * p - 1, - 1) =积分(@ (t)因为((2 * p - 1) * t) * my_fun (t参数),0,t);
输出(2 * p, 1) =积分(@ (t)罪(ω(2 * p - 1) * * t)。* my_fun (t参数),0,t);
结束
计算函数
my_fun (t参数)
对于一个给定的t是昂贵的和上面的问题循环功能
my_fun (t参数)
被称为两次。假设正交分 积分 命令是相同的,两次调用的函数是无效的。有解决这通过保持代码的结构提出了?

答案(2)

史蒂文的主
史蒂文的主 2分钟前
假设参数不会改变,考虑使用 memoize的 函数创建一个对象可以使用在你的被积函数函数来缓存相对应的输入和输出,所以如果你多次调用该函数相同的输入,它将使用缓存的结果。
memSin = memoize (@sin);
结果= 0 (1、5);
k = 1:5
结果(k) =积分(@ (x) memSin (x)。^ k, 0,π);
memSin.stats.Cache%显示缓存的使用
结束
ans =结构体字段:
输入:{{1×1细胞}}Nargout: 1输出:{{1×1细胞}}HitCount: 0 TotalHits: 0 TotalMisses: 1
ans =结构体字段:
输入:{{1×1细胞}}Nargout: 1输出:{{1×1细胞}}HitCount: 1 TotalHits: 1 TotalMisses: 1
ans =结构体字段:
输入:{{1×1细胞}}Nargout: 1输出:{{1×1细胞}}HitCount: 2 TotalHits: 2 TotalMisses: 1
ans =结构体字段:
输入:{{1×1细胞}}Nargout: 1输出:{{1×1细胞}}HitCount: 3 TotalHits: 3 TotalMisses: 1
ans =结构体字段:
输入:{{1×1细胞}}Nargout: 1输出:{{1×1细胞}}HitCount: 4 TotalHits: 4 TotalMisses: 1
结果
结果= 1×5
2.0000 1.5708 1.3333 1.1781 1.0667
注意,每次在第一,TotalMisses的数量(输入没有已经缓存)没有改变而HitCount(缓存)输入的数量已经增加了。

深成岩体施密特
深成岩体施密特 24分钟前
编辑:深成岩体施密特 20分钟前
谢谢你!有趣!我试着
mem_my_fun = memoize (@my_fun);
输出= 0 (2 * N, 1);
p = 1: N
输出(2 * p - 1, - 1) =积分(@ (t)因为((2 * p - 1) * t) * mem_my_fun (t参数),0,t);
输出(2 * p, 1) =积分(@ (t)罪(ω(2 * p - 1) * * t)。* mem_my_fun (t参数),0,t);
结束
但它是慢,约50%。但是,我不确定
mem_my_fun = memoize (@my_fun);
这是正确的方式来定义函数输入参数不改变?
1评论
深成岩体施密特
深成岩体施密特 17分钟前
编辑:深成岩体施密特 16分钟前
用你的例子,版本没有memoize的命令也快50%左右:
clearAllMemoizedCaches
memSin = memoize (@sin);
结果= 0 (1、5);
抽搐
k = 1:5
结果(k) =积分(@ (x) memSin (x)。^ k, 0,π);
% memSin.stats。缓存%显示缓存使用
结束
toc
clearAllMemoizedCaches
结果= 0 (1、5);
抽搐
k = 1:5
结果(k) =积分(@ (x) sin (x)。^ k, 0,π);
% memSin.stats。缓存%显示缓存使用
结束
toc

登录置评。

标签

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!