Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 创建具有函数和大小的数组_Matlab - Fatal编程技术网

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