我正在使用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个
答案 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]')