2015-01-13 2 views
3

У меня был небольшой (возможно, неэффективный) код Matlab, который генерировал матрицу значений функции произведения точек сетки сетки. Например:оценивать матричное выражение в точках сетки с помощью Julia

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 текст.

я могу осуществить это в Джулию с набором петель над местах сетки:

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 

... но было интересно, если есть более естественный (и эффективный) способ сделать это в Джулию?

ответ

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 

, но это не должно быть верно в целом.

+0

Я уверен, что это канонический подход :-) –

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] 
Смежные вопросы