创建具有函数和大小的数组



最近我写了以下语句

v = arrayfun(@(x) sum(randn(1, 4).^2), zeros(1, 1000000));

创建一个新的向量,现在我想问Matlab中是否存在一个函数来避免创建不必要的第二个向量zeros(1, 1000000)。我在找类似的东西

v = FUN(@someInitFunction, [rows, cols]);

没有循环、递归和不必要的分配,其中someInitFunction是给定的并且不能更改。Matlab是否提供了这样的函数FUN?一个简单的";不,它不存在">对我来说是一个有效的答案。

总结函数FUN:我想通过为这个新数组的每个元素调用函数someInitFunction来创建一个新数组。该阵列应等效于

[
someInitFunction() someInitFunction() ...;
someInitFunction() someInitFunction() ...;
.
.
.
someInitFunction() someInitFunction() ...
]

据我所知,没有内置函数。然而,创建自己的相对容易。

您询问了一个没有循环的解决方案,但您正在使用的当前解决方案(arrayfun(在引擎盖下使用循环,并且通常在组织得当的循环中对其进行编码实际上比arrayfun更快。

对于您的情况,函数GenArrayFun.m:

function out = GenArrayFun(initFunction , arraySize)
out = zeros(arraySize) ;
for k=1:numel(out)
out(k) = initFunction() ;
end

它有一个循环,但不超过arrayfun,并且执行速度似乎是原来的两倍(至少在我的安装R2016a、win10上(:

initFunction = @() sum(randn(1, 4).^2) ;
tic
v = arrayfun(@(x) sum(randn(1, 4).^2), zeros(1, 1000000));
toc
tic
out = GenArrayFun( initFunction , [1,1000000] );
toc

很抱歉,我没有花时间为这样一个小例子建立一个合适的timeit基准,我认为结果足够显著,可以注意到差异:

Elapsed time is 6.815043 seconds. % arrayfun
Elapsed time is 3.060161 seconds. % GenArrayFun

只是为了确保它评估每个元素的initFunction

>> out = GenArrayFun( initFunction , [2,3] )
out =
6.25676106665387          6.52758807745462          2.99236122767462
0.386750258201569         0.566092999842791          2.21158011908878

相关内容

  • 没有找到相关文章

最新更新