在Julia中传播向量和矩阵

7
我希望使用一个带点的标量函数来计算整个矩阵的输入值。该函数定义如下:
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尺寸相同的矩阵,每个半径都被相应的比电荷替换,由SpecificCharge给出。每个U--B对应一个通量密度,Rs中的行对应电压U,列对应通量密度B
问题是,我不确定Julia中的广播是如何工作的。如果我适当地转置向量UsBs,那么SpecificCharge.函数是否可以直接使用,还是我需要更改函数本身才能使其起作用?
1个回答

13
函数SpecificCharge,如果我适当地转置UsBs向量,它会像现在这样工作吗?还是我需要让函数本身变得复杂才能使其工作?
你试过了吗?它按照书写的方式工作,但我猜你想要转置UsBs中的一个来获得正确的“耦合”。
当您在不同的数组维度(例如向量和矩阵)中使用广播时,Julia会在单例维度上“扩展”数组。例如,向量将被扩展为一个矩阵,并在每列中复制向量。以下是一个示例以说明这一点。
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"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接