匿名函数中的 Matlab 大行

Matlab large rows in Anonymous Functions

在 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 输出为文本文件, 然后改变功能。 这行得通吗?或者有人有其他有效的解决方案? 谢谢!!

也许试试:

fun_total = @(x)reshape(repmat(1:numel(x).*x, 2, 1),[],1)

fun_total = @(x)reshape([1;1]*(1:numel(x).*x),[],1)

问题显然是,您正在生成 100000 个匿名函数 fun_temp(和 100000 个嵌套函数 fun_total)。这与生成所有 m 文件函数基本相同 function result=xTimes1(x)function result=xTimes2(x)function result=xTimes3(x)、...当你这样看时,这完全是荒谬的。最好的解决方案当然是使用像 Dan 这样的矢量化解决方案,但您也可以始终考虑使用单个 m 函数文件。

就效率而言,您应该期望此层次结构:

Lots of (anonymous) function calls < lots of for-loop iterations < vectorized code.

因此,作为矢量化解决方案的中间步骤,您可以使用:

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生成函数句柄。