最近我写了以下语句
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