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>
该错误已经提示了如何解决该问题:
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)
| 归档时间: |
|
| 查看次数: |
3861 次 |
| 最近记录: |