我有一个如下的数组:
x = 0:0.1:1;我想要一个 y 数组,它使用我的 Square 函数存储 x 的正方形。当然,有一种方法是: $ p $ y = zeros(1,10); for i = 1:10 y(i)= Square(x(i)); end
然而,我想应该有一种更优雅的方式。我尝试了一些我的见解并进行了一些搜索,但找不到任何解决方案。任何建议?
解决方案对于您给出的示例:
y = x。^ 2; %或 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 以外的任何东西都会阻止这一点。
Let's say I have a function, like:
function [result] = Square( x ) result = x * x; endAnd I have an array like the following,
x = 0:0.1:1;I want to have an y array, which stores the squares of x's using my Square function. Sure, one way would be the following,
y = zeros(1,10); for i = 1:10 y(i) = Square(x(i)); endHowever, I guess there should be a more elegant way of doing it. I tried some of my insights and made some search, however couldn't find any solution. Any suggestions?
解决方案For the example you give:
y = x.^2; % or y = x.*x;in which .* and .^ are the element-wise versions of * and ^. This is the simplest, fastest way there is.
More general:
y = arrayfun(@Square, x);which can be elegant, but it's usually pretty slow compared to
y = zeros(size(x)); for ii = 1:numel(x) y(ii) = Square(x(ii)); endI'd actually advise to stay away from arrayfun until profiling has showed that it is faster than a plain loop. Which will be seldom, if ever.
In new Matlab versions (R2008 and up), the JIT accelerates loops so effectively that things like arrayfun might actually disappear in a future release.
As an aside: note that I've used ii instead of i as the loop variable. In Matlab, i and j are built-in names for the imaginary unit. If you use it as a variable name, you'll lose some performance due to the necessary name resolution required. Using anything other than i or j will prevent that.
更多推荐
调用数组中所有元素的函数
发布评论