Matlab 创建具有函数和大小的数组
最近我写了这篇声明Matlab 创建具有函数和大小的数组,matlab,Matlab,最近我写了这篇声明 v = arrayfun(@(x) sum(randn(1, 4).^2), zeros(1, 1000000)); 要创建一个新的向量,现在我要问Matlab中是否存在一个函数,以避免创建不必要的第二个向量zero(110000)。我在找像这样的东西 v = FUN(@someInitFunction, [rows, cols]); 没有循环、递归和不必要的分配,其中someInitFunction是给定的,不能更改。Matlab是否提供了这样一个函数FUN?一个简单的
v = arrayfun(@(x) sum(randn(1, 4).^2), zeros(1, 1000000));
要创建一个新的向量,现在我要问Matlab中是否存在一个函数,以避免创建不必要的第二个向量zero(110000)
。我在找像这样的东西
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上):
很抱歉,我没有花时间为这样一个小示例构建一个适当的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
init函数是否依赖于它在输出数组中的索引/位置?@Hoki否,它总是相同的调用。就像在第一个例子中,它甚至没有参数。这应该是多普通?如果您的语句是
v=sum(randn(1000000,4)。^2,2),看起来会简单得多代码>一个简单的循环也可以避开创建巨大数组的需要…我突然觉得您希望initFunction
不仅被计算一次,而且对数组的每个元素都被计算一次,在这种情况下,我当前的答案是无用的。请确认。@Hoki是的,initFunction
对每个元素计算一次。正如您所看到的,数组的每个值都是相同的v=arrayfun(@()和(randn(1,4)。^2),零(1000000))代码>用不同的值创建一个数组。是的,我在发布答案后有这种感觉。我对此视而不见,因为在我的Matlab2016a上,您的语句没有运行(它可能需要一个支持隐式扩展的Matlab版本)。这是我的错误。我只是在八度音阶而不是Matlab中试过。在Matlab中,匿名函数需要一个参数。“我在我的问题中改变了它。”汤姆萨布利克,我重写了一个解决方案。很抱歉,它仍然有一个循环,但它的调用时间较短,而且似乎比arrayfun
快。
>> out = GenArrayFun( initFunction , [2,3] )
out =
6.25676106665387 6.52758807745462 2.99236122767462
0.386750258201569 0.566092999842791 2.21158011908878