Julia:循环遍历矩阵的行(或不循环)

人气:157 发布:2022-10-16 标签: iterator matrix julia

问题描述

假设我有一个字符串向量,如下所示

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.组合mapeachrow

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)

(对于更灵活的地图切片,开销较小)

820