如何评估输入数组的函数[matlab]

时间:2016-11-13 08:55:01

标签: matlab vectorization

假设我在matlab中有一个函数onBehalfOfContentOwnerChannel

func.m

和两个定义为

的向量
  function [sum] = func(x)
      d = length(x);
      sum = 0;
      for i = 1:d
        sum = sum + x(i)^2;
    end
  end

如何评估函数值 x1 = 1:10; x2 = 1:10; 并将结果存储在向量中而不使用for循环。

2 个答案:

答案 0 :(得分:0)

由于您已经询问了如何对代码进行矢量化,因此以下是一些建议。首先,我首先更新func.m的函数定义。

function s = func(x)
    s = sum(x.^2); % An alternate way is to do: s = diag(x'*x)';
end

其次,关于你在第二部分尝试做什么并不是很清楚。假设您有两个行向量 x1和x2,并且想要同时评估两个向量的函数,那么您可以执行:

s = func([x1; x2]') % and you will have s(1) and s(2) for the vectors.

如果您想在矢量之间进行操作,因此需要10个不同的func值,请执行以下操作:

s = func([x1; x2]) % and s is then a 1 x 10 array.

但是,作为一条建议,我建议你坚持使用一种矢量符号。通常MATLAB默认使用column major,因为如果使用矩阵作为参数,大多数函数都会沿着每列执行。这就是为什么在上面描述的func.m中,如果您传入矩阵,默认行为是评估每列的func.m

答案 1 :(得分:0)

首先,您需要创建一个矩阵M,其中每列是您要发送给函数的一对参数。

e.g:

>> x1 = 1:10
>> x2 = 1:10

x1 =

     1     2     3     4     5     6     7     8     9    10


x2 =

     1     2     3     4     5     6     7     8     9    10

>> M =[x1;x2]

M =

     1     2     3     4     5     6     7     8     9    10
     1     2     3     4     5     6     7     8     9    10

然后我们创建一个包含参数对(M'列)的单元格数组:

>> M2 = num2cell(M, 1)

M2 = 

    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]    [2x1 double]

这给了我们这样一个单元格阵列:

>> M2{1}

ans =

     1
     1

>> M2{3}

ans =

     3
     3

现在您要使用单元格数组和所需函数调用cellfun

e.g。使用默认的sum函数:

>> cellfun(@sum, M2)

ans =

     2     4     6     8    10    12    14    16    18    20

或使用func

>> cellfun(@func, M2)

ans =

     2     8    18    32    50    72    98   128   162   200

BTW,你的函数func只是l2 norm的平方,已经存在于matlab中:

>> cellfun(@norm, M2) .^ 2

ans =

    2.0000    8.0000   18.0000   32.0000   50.0000   72.0000   98.0000  128.0000  162.0000  200.0000