Octave 是否有类似arrayfun的东西,但用于多维?

Octave 是否有类似arrayfun的东西,但用于多维?,octave,cartesian-product,Octave,Cartesian Product,给定 我想要一个矩阵 X = [x0,x1,...,xN]; Y = [y0,y1,...,yM]; function result = f(x, y) ... % Cannot use broadcasting. Must take values. Returns a value. end 我知道我可以使用两个嵌套的来进行循环,但是有什么东西可以将其并行化吗?界面类似于arrayfun 对于那些对f功能感兴趣的人: f(x0,y0) f(x0,y1) ... f(x0,yM) f(

给定

我想要一个矩阵

X = [x0,x1,...,xN];
Y = [y0,y1,...,yM];
function result = f(x, y)
    ... % Cannot use broadcasting. Must take values. Returns a value.
end
我知道我可以使用两个嵌套的
来进行
循环,但是有什么东西可以将其并行化吗?界面类似于
arrayfun


对于那些对
f
功能感兴趣的人:

f(x0,y0) f(x0,y1) ... f(x0,yM)
f(x1,y0) f(x1,y1) ... f(x1,yM)
...      ...      ... ...
f(xN,y0) f(xN,y1) ... f(xN,yN)

这样的办法应该行得通

X = [some vector]
W = [some vector]
p(w) % returns a real number; for given vector, returns a vector
g(x, w) % returns value from X; can use broadcasting just like (x .* w).

function result = f(x, y)                  % takes 2 values from X
    result = sum( p( W( g(x,W) == y ) ) );
    %                   |         |        - boolean vector
    %                |              |      - vector of some values from W
    %             |                   |    - vector of some real values
    %        |                          |  - a single value
end
使
bsxfun
起作用的关键是安排输入,使其正确展开。使用
doc bsxfun
查看您需要的非单例维度,以获得所需的输出


当然,我的输出是从原始请求转换过来的,但这很容易用
res=res'解决

@Matt的答案看起来比这更好,但它肯定可以通过
arrayfun
实现,只需使用
meshgrid
'
格式化输入和输出即可:

   f = @(a,b) a + b;
   x = (0:10)';
   y = -5:1;
   res = bsxfun(f, x, y);

res =

-5    -4    -3    -2    -1     0     1
-4    -3    -2    -1     0     1     2
-3    -2    -1     0     1     2     3
-2    -1     0     1     2     3     4
-1     0     1     2     3     4     5
 0     1     2     3     4     5     6
 1     2     3     4     5     6     7
 2     3     4     5     6     7     8
 3     4     5     6     7     8     9
 4     5     6     7     8     9    10
 5     6     7     8     9    10    11

也许值得一看。你能分享函数
f
的实现吗?
arrayfun
不是并行的,它只是编写迭代的另一种方式。至少在最近的matlab版本中,我希望嵌套循环至少与任何其他解决方案一样快。除非您使用广播完成。FYI
arrayfun
可以接受多个参数:
arrayfun(@(x,y)f(x,y),x,y)
@Geoff是的,但输入必须是大小相同的向量,并且它会生成
f(x0,y0)f(x1,y1)的向量。。。f(xN,yN)
。完全不同。那么,
g(x,w)
(x.*w)
g
是一个函数,对吗?倍频程文档说“函数F必须能够接受两个长度相等的列向量参数,或者一个列向量参数和一个标量。”。正如我写的,我的函数必须有两个值。@etam1024然后你需要从你的问题中删除
matlab
标记。因为它在Matlab中运行良好。很明显,我的示例显示了两个不同长度的向量。但是
bsxfun
上的Matlab文档还说,函数必须接受向量作为参数(我不会将其粘贴在这里,因为它很长)。修改你的
f
函数,使其显示传递的参数并告诉你得到了什么。@etam1024我不知道你在读什么文档,但它不是来自MathWorks。“形式为C=fun(A,B)的二进制元素智能函数接受大小任意但相同的数组A和B,并返回大小相同的输出。[…]fun还必须支持标量扩展,例如,如果A或B是标量,C是将标量应用于其他输入数组中的每个元素的结果“我在发布我的解决方案之前没有意识到MATLAB标记已被删除——如果此解决方案对倍频程无效,我将删除它。不要删除它!它工作得很好!谢谢:)(小改动:使用
ndgrid
不需要转置)虽然它仍然是顺序的,速度与嵌套循环相同,但至少我的代码更干净了。
X       = rand(10,1); 
Y       = rand(5,1); 
f       = @(a,b) a+b;
[xx,yy] = meshgrid(X,Y);
out     = arrayfun(@(a,b) f(a,b),xx,yy)';