Function 数组中所有元素的调用函数

Function 数组中所有元素的调用函数,function,matlab,indexing,Function,Matlab,Indexing,假设我有一个函数,比如: function [result] = Square( x ) result = x * x; end 我有一个如下的数组 x = 0:0.1:1; y = zeros(1,10); for i = 1:10 y(i) = Square(x(i)); end 我想要一个y数组,它使用我的Square函数存储x的平方。当然,一种方法是: x = 0:0.1:1; y = zeros(1,10); for i = 1:10 y(i) =

假设我有一个函数,比如:

function [result] = Square( x )
    result = x * x;
end
我有一个如下的数组

x = 0:0.1:1;
y = zeros(1,10);

for i = 1:10
    y(i) = Square(x(i));
end
我想要一个
y
数组,它使用我的
Square
函数存储
x
的平方。当然,一种方法是:

x = 0:0.1:1;
y = zeros(1,10);

for i = 1:10
    y(i) = Square(x(i));
end

然而,我想应该有一种更优雅的方式来做。我尝试了我的一些见解并进行了一些搜索,但没有找到任何解决方案。有什么建议吗?

你想要
arrayfun

arrayfun(@Square, x)
请参阅帮助列表功能


(仅在GNU倍频程中测试,我没有MATLAB)

您是否考虑过逐元素操作符
*


有关您给出的示例,请参阅。

的文档:

y = x.^2;   % or
y = x.*x;
其中
*
^
*
^
的元素版本。这是最简单、最快的方法

更一般的:

y = arrayfun(@Square, x);
这可能是优雅的,但与之相比,它通常相当慢

y = zeros(size(x));
for ii = 1:numel(x)
    y(ii) = Square(x(ii)); end
实际上,我建议不要使用
arrayfun
,直到分析表明它比普通循环快。这将是罕见的,如果有的话

在新的Matlab版本(R2008和更高版本)中,JIT有效地加速了循环,以至于类似于
arrayfun
的东西可能在未来的版本中消失


顺便说一句:注意我使用了
ii
而不是
I
作为循环变量。在Matlab中,
i
j
是虚拟单元的内置名称。如果将其用作变量名,那么由于需要进行必要的名称解析,您将失去一些性能。使用除
i
j
以外的任何方法都可以防止这种情况。

我假设您不会做像平方运算这样简单的事情,并且您尝试做的事情还没有在MATLAB中矢量化

最好只调用一次函数,然后在函数中执行循环。随着元素数量的增加,您将注意到操作时间显著增加

让我们的职能是:

function result = getSquare(x)
    result = x*x; % I did not use .* on purpose
end

function result = getSquareVec(x)
result = zeros(1,numel(x));
    for idx = 1:numel(x)
        result(:,idx) = x(idx)*x(idx);
    end
end
让我们从脚本中调用它们:

y = 1:10000;
tic;
for idx = 1:numel(y)
    res = getSquare(y(idx));
end
toc

tic;
    res = getSquareVec(y);
toc
我运行了几次代码,结果表明只调用一次函数至少是调用速度的两倍

Elapsed time is 0.020524 seconds.
Elapsed time is 0.008560 seconds.

Elapsed time is 0.019019 seconds.
Elapsed time is 0.007661 seconds.

Elapsed time is 0.022532 seconds.
Elapsed time is 0.006731 seconds.

Elapsed time is 0.023051 seconds.
Elapsed time is 0.005951 seconds.

你完全正确,
arrayfun
比elementwise内置函数慢-除非你使用的是
gpuArray
s,其中
arrayfun
是最好的选择。@Edric:该死的,我真希望我有一个GPU来处理这些东西……我一点都不知道!谢谢你的提醒。我想象的速度并不总是更快(由于相关的内存问题),但我仍然可以想象它通常会更快。@Edric:顺便说一下,真的吗?为什么
x.^2
(使用
x
a
gpuArray
)不会分布在GPU上?是的-
gpuArray(…)。^2
当然会分布在GPU上,但是如果您正在运行多个操作,那么当前最好将它们合并到一个
arrayfun
调用中,而不是单独调用。