我有一小部分(可能是低效的)Matlab代码,它生成了网格网格点乘积函数值的矩阵。例如:
N = 2 ;
r = -N:N ;
[X1, X2] = ndgrid( r, r ) ;
f = @( x ) ( x ) ; % identity: dummy function for this example.
X1
X2
f( X1 .* X2 )
制造
X1 =
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
X2 =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
ans =
4 2 0 -2 -4
2 1 0 -1 -2
0 0 0 0 0
-2 -1 0 1 2
-4 -2 0 2 4
这是基于this answer和此Matlab Evaluate Function over gridded domain help文字。
我可以在Julia中通过网格位置上的一组循环来实现它:
N = 2 ;
r = -N:N ;
twoNplusOne = 2*N + 1 ;
F = zeros( twoNplusOne, twoNplusOne ) ;
f = identity ; #say
for n = 1:twoNplusOne
for m = 1:twoNplusOne
F[ n, m ] = f( r[n]*r[m] ) ;
end
end
F
......但是想知道朱莉娅是否有更自然(和更有效)的方式来做这件事?
答案 0 :(得分:3)
不确定这是否是规范的Julian方法,但您可以使用broadcast
:
julia> broadcast((x,y)->f(x*y), -N:N, (-N:N)')
5x5 Array{Int32,2}:
4 2 0 -2 -4
2 1 0 -1 -2
0 0 0 0 0
-2 -1 0 1 2
-4 -2 0 2 4
我使用'
将范围从大小(5,)
变为(1,5)
之一。实际上,在这种特殊情况下,由于函数接受标量参数并且仅取决于X1和X2的乘积,我们甚至可以逃脱
julia> f((-N:N) .* (-N:N)')
5x5 Array{Int32,2}:
4 2 0 -2 -4
2 1 0 -1 -2
0 0 0 0 0
-2 -1 0 1 2
-4 -2 0 2 4
但这一般不一定是真的。
答案 1 :(得分:2)
正确的方法是使用列表/矩阵理解:
[i*j for i in -2:2, j in -2:2]
或更普遍的功能
f(x,y) = x*y
[f(i,j) for i in -2:2, j in -2:2]