匿名函数中的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大行的主要内容,如果未能解决你的问题,请参考以下文章

使用匿名函数瓶颈提高 matlab 代码的性能

添加匿名函数 matlab

Matlab Codegen:不支持匿名函数

在具有 GPU 加速的 arrayfun 中使用匿名函数 (Matlab)

matlab函数赋值如何实现?

匿名函数,向量化和预分配,函数的函数,P码文件