匿名函数中的Matlab大行
Posted
技术标签:
【中文标题】匿名函数中的Matlab大行【英文标题】:Matlab large rows in Anonymous Functions 【发布时间】:2015-02-04 09:41:57 【问题描述】:在 Matlab 匿名函数中,我希望有这样的函数 fun_total
fun_total = @(x) [ 0;
1*x(1);
1*x(1);
2*x(2);
2*x(2);
...
100000*x(100000);
100000*x(100000);]
这是我的代码
fun_total = @(x) [0];
for i = 1 : 100000
fun_temp = @(x) i*x(i);
fun_total = @(x) [ fun_total(x); fun_temp(x) ];
fun_total = @(x) [ fun_total(x); fun_temp(x) ];
end
我的问题是循环迭代变大时太慢了。 每次 fun_total = @(x) [ fun_total(x); fun_temp(x) ]; fun_total(x) 会先展开,再合并。
现在我有一个解决方案是将我的 fun_total 输出为文本文件, 然后更改为功能。 这能行吗?或者有人有其他有效的解决方案? 谢谢!!
【问题讨论】:
【参考方案1】:问题显然是,您正在生成 100000 个匿名函数 fun_temp
(和 100000 个嵌套函数 fun_total
)。这与生成所有 m-file-functions 基本相同
function result=xTimes1(x)
, function result=xTimes2(x)
, function result=xTimes3(x)
,... 当你这样看时,这完全是荒谬的。最好的解决方案当然是使用像 Dan 这样的矢量化解决方案,但您也可以始终考虑使用单个 m 函数文件。
就效率而言,您应该期望这种层次结构:
大量(匿名)函数调用for-loop迭代
因此,作为矢量化解决方案的中间步骤,您可以使用:
function total = fun_total(x)
total = zeros(2*length(x)+1,1);
for i = 1:length(x)
total([2*i,2*i+1]) = [i*x(i); i*x(i)];
end
然后使用@fun_total
生成函数句柄。
【讨论】:
专为层次结构:+1【参考方案2】:不妨试试:
fun_total = @(x)reshape(repmat(1:numel(x).*x, 2, 1),[],1)
或
fun_total = @(x)reshape([1;1]*(1:numel(x).*x),[],1)
【讨论】:
以上是关于匿名函数中的Matlab大行的主要内容,如果未能解决你的问题,请参考以下文章