Matrix 使用Julia计算网格中点处的矩阵表达式

Matrix 使用Julia计算网格中点处的矩阵表达式,matrix,julia,Matrix,Julia,我有一小部分(也许效率很低)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

我有一小部分(也许效率很低)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
这是基于,和这个Matlab文本

我可以在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

。。。但是想知道在朱莉娅身上是否有一种更自然(更有效)的方法来做到这一点吗?

不确定这是否是典型的朱利安方法,但你可以使用
广播

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

但一般来说,这不一定是正确的。

正确的方法是使用列表/矩阵理解:

[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]

我很确定这就是典型的方法:-)