Трансляция векторов и матриц в Юлии - PullRequest
7 голосов
/ 13 марта 2020

Я хотел бы использовать точечную версию скалярной функции для вычисления значений для всей матрицы входных данных. Функция определяется следующим образом:

function SpecificCharge(U, r, B)
 ( 2 * U ) / ( r^2 * B^2 )
end

, и я хотел бы дать ей следующие входные данные:

const Us = [ # voltages U
  228.9, 243, 257, 271, 285, 300
]

const Rs = [ # radii r
  9 7 5.8 5 4.3 3.9;
  10.5 8.1 6.7 5.7 4.9 4.5;
  10.1 8.3 7.1 6.5 6 4.8;
  11.1 9.0 7.2 6.5 5.6 5.1;
  10.5 8.3 7.8 6.5 5.7 5.4;
  11.9 8.9 8.0 7.4 6.2 5.5
]

const Bs = [ # flux densities B
  0.0007332339999999999, 0.00089328, 0.0010421599999999999, 0.00119104, 0.00133992, 0.0014873112
]

# Calling the dotted version of the function
specific_charges = SpecificCharge.(Us, Rs, Bs)

Результат должен быть матрицей с такими же размерами, как Rs, с каждым радиусом, замененным соответствующим указанным c зарядом, данным SpecificCharge. Каждой паре U - B соответствует одна плотность потока, а строки в Rs соответствуют напряжениям U, а столбцы - плотности потоков B.

Проблема заключается в том, Я не уверен, как вещание работает в Юлии. Работает ли функция SpecificCharge. как есть, если я просто транспонирую векторы Us и Bs соответствующим образом, или мне нужно усложнить саму функцию, чтобы эта работа работала?

1 Ответ

14 голосов
/ 13 марта 2020

Имеет ли функция SpecificCharge. работать как есть, если я просто транспонирую векторы Us и Bs соответствующим образом, или мне нужно усложнить саму функцию, чтобы сделать эту работу?

Вы пробовали это? Он работает как написано, однако, я предполагаю, что вы хотите транспонировать либо Us, либо Bs, чтобы получить правильную "связь".


Когда вы используете широковещательную передачу с различными размерами массива (векторы и матрицы в вашем примере) Юлия "расширит" массивы в одноэлементных измерениях. Например, вектор будет расширен до матрицы с копией вектора в каждом столбце. Вот пример, чтобы проиллюстрировать это

julia> A = ["A1", "A2"];

julia> B = ["B11" "B12" "B13";
            "B21" "B22" "B23"];

julia> f(args...) = join(args, ", ");

julia> f.(A, B)
2×3 Array{String,2}:
 "A1, B11"  "A1, B12"  "A1, B13"
 "A2, B21"  "A2, B22"  "A2, B23"

. Как видите, вектор A был расширен в одноэлементном измерении до

julia> A2 = [A A A]
2×3 Array{String,2}:
 "A1"  "A1"  "A1"
 "A2"  "A2"  "A2"

так, что он имеет тот же размер как B, а затем f применяется к каждой паре. Чтобы расширить вектор в другом измерении, вам нужно его переставить;

julia> C = ["C1", "C2", "C3"];

julia> f.(B, permutedims(C))
2×3 Array{String,2}:
 "B11, C1"  "B12, C2"  "B13, C3"
 "B21, C1"  "B22, C2"  "B23, C3"

, а теперь C расширен в первом измерении (одноместное измерение), по существу,

julia> C2 = [permutedims(C); permutedims(C); permutedims(C)]
3×3 Array{String,2}:
 "C1"  "C2"  "C3"
 "C1"  "C2"  "C3"
 "C1"  "C2"  "C3"
...