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

dje*_*lin 5 matlab vectorization octave

我正在使用Octave,并且想要一个接受单个实数作为输入的函数,并输出一个固定长度的行向量.我明白arrayfun应该能够从不清楚的文档中做到这一点.从help arrayfunOctave 3.2开始:

如果在另一个字符串输入参数"UniformOutput"之后的参数VAL设置为"true"(默认值),则命名函数FUNC必须返回单个元素,然后该元素将连接到返回值并且是matrix类型.否则,如果该参数设置为"false",则输出将在单元数组中连接.

然而,似乎Matlab的版本更宽容:

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

看起来这在Matlab中有效,但在Octave中无效.我是否认为arrayfun在Octave中无法使用此推广?是否有一些更聪明的方法来实现这一点,而不诉诸非流量化的循环?

作为参考,这是我的Octave结果:

octave:5> nums
nums =

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

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

Dan*_*iel 1

该错误已经提示了如何解决该问题:

arrayfun(nums,[1,2,3],'UniformOutput',false)
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)

八度:

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> 
Run Code Online (Sandbox Code Playgroud)

如果你的功能真的那么简单,我建议使用:

nums([1,2,3]')
Run Code Online (Sandbox Code Playgroud)