【问题标题】:How to evaluate function for input array [matlab]如何评估输入数组的函数 [matlab]
【发布时间】:2016-11-13 20:05:07
【问题描述】:

假设我在matlab中有一个函数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 循环的情况下评估函数值 for each [x1[i] x2[i]] for i = 1:10 并将结果存储在向量中。

【问题讨论】:

  • 有点不清楚您要做什么。请澄清
  • @Italy 我想要的是这个 z[1] = func([x1[1] x2[1]]), z[2] = func([x1[2] x2[2] ]), ... z[10] = func([x1[10] x2[10]])

标签: matlab vectorization


【解决方案1】:

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

例如:

>> 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

例如使用默认的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

顺便说一句,你的函数 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

【讨论】:

    【解决方案2】:

    既然您已经询问了对代码进行矢量化的方法,这里有一些建议。首先,我先更新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 默认使用主要列,因为如果使用矩阵作为参数,大多数函数会沿每一列执行。这就是为什么在我上面描述的func.m 中,如果你传入一个矩阵,默认行为是沿每一列评估func.m

    【讨论】:

    • 我希望s 成为向量,而您上面的代码s 是一个缩放器。
    • 我不确定您是否执行了我的代码或完全阅读了答案,第二个示例用法为您提供了一个包含 10 个元素的向量,其方式比为这样一个微不足道的任务创建单元格要简单得多。你得到 s(1) 作为函数对 x1(1) 和 x2(1) 的评估,s(2) 在接下来的两个点,依此类推。
    猜你喜欢
    • 2015-11-06
    • 2018-10-04
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多