问题描述
假设我有一个字符串向量,如下所示
julia> R = ["ABC","DEF"]
2-element Vector{String}:
"ABC"
"DEF"
现在我复制元素以形成一个2*2矩阵:
julia> x = [R R]
2×2 Matrix{String}:
"ABC" "ABC"
"DEF" "DEF"
我想要实现的是连接矩阵中每一行的字符串。我能想到的最好结果是
julia> [join(x[i,:]) for i in 1:length(x)÷2]
2-element Vector{String}:
"ABCABC"
"DEFDEF"
这将提供所需的结果。
是否有其他解决方案(没有显式循环)?我尝试查找广播的工作语法,但失败了。
(我尝试的另一个想法是
julia> x = [R,R]
2-element Vector{Vector{String}}:
["ABC", "DEF"]
["ABC", "DEF"]
julia> join.(x)
2-element Vector{String}:
"ABCDEF"
"ABCDEF"
哪个更简单,但显然没有提供所需的结果。)
推荐答案
我得到了几个将函数应用到矩阵行的选项:
julia> x = ["ABC" "ABC"; "DEF" "DEF"]
2×2 Matrix{String}:
"ABC" "ABC"
"DEF" "DEF"
1.使用mapslices
类映射Synatax
您要查找的函数可能是mapslices(f, A; dims)
:
julia> mapslices(join, x; dims=[2])
2×1 Matrix{String}:
"ABCABC"
"DEFDEF"
它是根据dims
指定的维度在数组的&q;切片而不是元素上调用的映射。
2.使用eachrow
广播语法
eachrow(A::AbstractVecOrMat)
在矩阵的各行上创建迭代器,为每个迭代器返回数组view。
julia> join.(eachrow(x))
2-element Vector{String}:
"ABCABC"
"DEFDEF"
3.组合map
和eachrow
julia> map(join, eachrow(x))
2-element Vector{String}:
"ABCABC"
"DEFDEF"
在使用BenchmarkTools的100x100随机阵列上,这三种方法的性能似乎相同:
方法 性能 1.@btime mapslices(join, x; dims=[2])
1.379毫秒(21935分配:4.92MiB)
2.@btime join.(eachrow(x))
1.296毫秒(21206分配:4.82 MiB)
3.@btime map(join, eachrow(x))
1.294毫秒(21304分配:4.82 MiB)
(对于更灵活的地图切片,开销较小)