Eu gostaria de usar uma versão pontilhada de uma função escalar a valores calcular para toda uma matriz de entradas. A função é definida como se segue:
function SpecificCharge(U, r, B)
( 2 * U ) / ( r^2 * B^2 )
end
e eu gostaria de dar-lhe as seguintes entradas:
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)
O resultado deve ser uma matriz de mesmas dimensões que Rs
, com cada raio passa a ter a carga específica correspondente, dada por SpecificCharge
. Existe uma densidade de fluxo que corresponde a cada um U
- B
par, e as linhas Rs
correspondem a tensões U
e colunas para densidades de fluxo B
.
O problema é, eu não sei como difusão das obras em Julia. Será que a função de SpecificCharge.
trabalho como é, se eu simplesmente transpor os vetores Us
e Bs
de forma adequada, ou que eu preciso para complicar a própria função para fazer este trabalho?
Faz a função
SpecificCharge
. trabalho como é, se eu simplesmente transpor os vetoresUs
eBs
de forma adequada, ou que eu preciso para complicar a própria função para fazer este trabalho?
Você tentou isso? Ele funciona como escrita, no entanto, eu estou supondo que você quer transpor quer Us
ou Bs
para obter o correto "acoplamento".
Quando você usa transmissão com diferentes dimensões da matriz (vetores e matrizes no seu exemplo) Julia vai "estender" matrizes nas dimensões únicas. Por exemplo, um vector vai ser alargada a uma matriz com uma cópia do vector em cada coluna. Aqui está um exemplo para ilustrar este
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"
Como você pode ver, o vector A
foi estendido na dimensão singleton para
julia> A2 = [A A A]
2×3 Array{String,2}:
"A1" "A1" "A1"
"A2" "A2" "A2"
de tal modo que tem o mesmo tamanho B
, e, em seguida, f
é aplicada a cada par. Para estender um vetor na outra dimensão que você precisa para permutar-lo;
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"
e agora C
foi estendida na primeira dimensão (dimensão Singleton), essencialmente
julia> C2 = [permutedims(C); permutedims(C); permutedims(C)]
3×3 Array{String,2}:
"C1" "C2" "C3"
"C1" "C2" "C3"
"C1" "C2" "C3"