Vectorize函数使用arrayfun输出一行,返回一个矩阵

时间:2013-12-10 16:52:01

标签: matlab octave vectorization

我正在使用Octave,并且想要一个接受单个实数作为输入的函数,并输出一个固定长度的行向量。我理解arrayfun应该能够从其不清楚的文档中做到这一点。来自Octave 3.2中的help arrayfun

  

如果参数VAL后面还有一个字符串输入参数   “UniformOutput”设置为“true”(默认值),然后是命名    函数FUNC必须返回一个单独的元素    连接到返回值并且是矩阵类型。    否则,如果该参数设置为“false”,则输出    在单元格数组中连接。

但似乎是Matlab's version is more forgiving

  

[B1,...,Bm] = arrayfun(func,A1,...,An)调用函数handle func指定的函数,并传递来自数组A1,...,An的元素,其中n是函数func的输入数量。输出数组B1,...,Bm,其中m是函数func的输出数,包含函数调用的组合输出。第i次迭代对应于语法[B1(i),...,Bm(i)] = func(A1 {i},...,An {i})。 arrayfun函数不按特定顺序执行函数func的调用。

看起来这在Matlab中有效,但在Octave中无效。我是否认为在Octave中使用arrayfun无法执行此推广?是否有一些更聪明的方法来实现这一目标而不诉诸非虚函数的循环?

供参考,这是我的八度结果:

  

八度:5个NUMS
  nums =

     

@(c)([c,c + 2,c + 4])

     

八度:6个arrayfun(NUMS,[1,2,3])
  错误:cellfun:期望所有值都是UniformOutput = true的标量   错误:来自:   错误:/opt/local/share/octave/3.2.4/m/general/arrayfun.m第168行第21行   八度:6个

2 个答案:

答案 0 :(得分:2)

使用arrayfun将函数nums应用于数组[1,2,3]

CellArray = arrayfun(nums, [1,2,3], "UniformOutput", false);

这会给你一个单元格数组。如果您想在矩阵中使用答案,请使用cell2mat

cell2mat(CellArray);

如果您的实际nums更复杂,那么我们需要一个更好的例子来建议解决方案。

答案 1 :(得分:0)

错误已经暗示如何解决问题:

arrayfun(nums,[1,2,3],'UniformOutput',false)

Matlab和Octave之间没有区别。

Matlab的:

>> nums=@(c) ([c, c + 2, c + 4])

nums = 

    @(c)([c,c+2,c+4])

EDU>> arrayfun(nums,[1,2,3])
Error using arrayfun
Non-scalar in Uniform output, at
index 1, output 1.
Set 'UniformOutput' to false.

>> arrayfun(nums,[1,2,3],'UniformOutput',false)

ans = 

  Columns 1 through 2

    [1x3 double]    [1x3 double]

  Column 3

    [1x3 double]

八度:

octave:1> nums=@(c) ([c, c + 2, c + 4])
nums =

@(c) ([c, c + 2, c + 4])

octave:2> arrayfun(nums,[1,2,3])
error: arrayfun: all values must be scalars when UniformOutput = true
octave:2> arrayfun(nums,[1,2,3],'UniformOutput',false)
ans = 
{
  [1,1] =

     1   3   5

  [1,2] =

     2   4   6

  [1,3] =

     3   5   7

}
octave:3> 

如果您的功能非常简单,我建议使用:

nums([1,2,3]')