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版本中,我希望嵌套循环至少与任何其他解决方案一样快。除非您使用广播完成。FYIarrayfun
可以接受多个参数: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)';