2017-09-15 73 views
1

我一直在使用理解來組合字符串向量,但感覺有點笨拙。Julia:如何將一個矩陣的兩個字符串列連接在一起

mymat = [collect('a':'z') collect('A':'Z')] 
[join(mymat[i,:]) for i in 1:size(mymat)[1]] 
+2

我會做一些事情,比如'mapslices(X - > 「$(X [1])$(X [2])」,mymat,2)',但我不能說它不那麼笨重。 –

+0

我更喜歡它。少一個大小(mymat)[1]'! – fsmart

+3

如果你不在乎'join'比'「$(x [1])$(x [2])」'稍微慢一些(因爲它更普遍),'mapslices(join,mymat, 2)'更清潔。 –

回答

3

有許多方法來做到這一點。 意識到你加入兩個字符,而不是兩個字符串。 性能在寬的範圍內(1至79)的不同之

意識到的結果不同的類型(矩陣(26x1)或載體(26))

製備(使用朱0.6.0.1)

mymat = [collect('a':'z') collect('A':'Z')] 
using BenchmarkTools 


@btime mapslices(join, mymat, 2) 
    79.372 μs (425 allocations: 15.63 KiB) 
    26×1 Array{String,2} 

@btime mapslices(x->"$(x[1])$(x[2])", mymat, 2) 
    32.144 μs (297 allocations: 10.78 KiB) 
    26×1 Array{String,2}: 

@btime [join(mymat[i,:]) for i in 1:size(mymat)[1]] 
    45.677 μs (212 allocations: 8.95 KiB) 
    26-element Array{String,1} 

@btime [join(mymat[i,:]) for i in 1:size(mymat, 1)] 
    44.494 μs (211 allocations: 8.92 KiB) 
    26-element Array{String,1} 

@btime [join(mymat[i,:]) for i in indices(mymat, 1)] 
    44.806 μs (211 allocations: 8.89 KiB) 
    26-element Array{String,1} 

@btime [join($mymat[i,:]) for i in indices($mymat, 1)] 
    44.806 μs (211 allocations: 8.89 KiB) 
    26-element Array{String,1} 

@btime [join($mymat[i,:]) for i in indices($mymat, 1)] 
    12.411 μs (211 allocations: 8.91 KiB) 
    26-element Array{String,1} 

@btime ["$(mymat[i,1])$(mymat[i,2])" for i in 1:size(mymat)[1]] 
    4.255 μs (32 allocations: 1.30 KiB) 
    26-element Array{String,1} 

@btime [string(mymat[i,1], mymat[i,2]) for i in 1:size(mymat)[1]] 
    4.157 μs (32 allocations: 1.30 KiB) 
    26-element Array{String,1} 

@btime [string($mymat[i,1],$mymat[i,1]) for i in indices($mymat, 1)] 
    1.080 μs (29 allocations: 1.20 KiB) 
    26-element Array{String,1} 

@btime string.(mymat[:,1], mymat[:,2]) 
    15.775 μs (56 allocations: 2.64 KiB) 
    26-element Array{String,1} 

@btime string.($mymat[:,1], $mymat[:,2]) 
    1.133 μs (31 allocations: 1.55 KiB) 
    26-element Array{String,1} 
+0

提示:您可以(應該)使用'size(mymat,1)'而不是'size(mymat)[1]',實際上可能是'indices(mymat,1)'for概論。另外,插入'@ btime'宏的變量。 '@btime [string($ mymat [i,1],$ mymat [i,2])在索引($ mymat,1)中''的幾乎是'$'的5倍。 – DNF

+0

我打算推薦'mymat [:,1]。* mymat [:,2]'或@views mymat [:,1]。* mymat [:, 2]'但是意識到'*'不是爲'Char'定義。奇怪的? – DNF

+0

謝謝你的提示,我添加了這樣的案例,並找出了比以前最快的案例快4倍的案例 –

6

您可以使用mapslices這個:

julia> mapslices(join, mymat, 2) 
26×1 Array{String,2}: 
"aA" 
"bB" 
"cC" 
"dD" 
"eE" 
+3

哦,哎呀,我看到@Michael K. Borregaard和@鳳陽王在評論中打敗了我。發佈這些答案! –

+0

返回類型不同於原始方法 –

相關問題