2017-04-11 1 views
1

zu unterteilen Ich bin versucht, eine Vector{String} in Julia unter Verwendung einer Kombination Integer und Vector{Integer} Subset-Werte zu unterteilen. Ich möchte eine Funktion schreiben, die grundsätzlich eine Teilmenge von "asdf"[1:3] mit jedem der drei Argumente x[y:z] zu entweder Vektoren oder Singletons erlaubt.Verwenden eines Vektors, um Elemente innerhalb eines Zeichenfolgevektors in Julia

Das ist, was ich bisher versucht haben:

es zu benutzen
function substring(x::Array{String}, y::Integer, z::Integer) 
    y = fill(y, length(x)) 
    z = fill(z, length(x)) 
    substring(x, y, z) 
end 

function substring(x::Vector{String}, y::Vector{Integer}, z::Integer) 
    y = fill(y, length(x)) 
    substring(x, y, z) 
end 

function substring(x::Vector{String}, y::Integer, z::Vector{Integer}) 
    z = fill(z, length(x)) 
    substring(x, y, z) 
end 

function substring(x::Vector{String}, y::Vector{Integer}, z::Vector{Integer}) 
    for i = 1:length(x) 
    x[i] = x[i][y[i]:min(z[i], length(x[i]))] 
    # If z[i] is greater than the length of x[i] 
    # return the end of the string 
    end 
    x 
end 

Versuch:

v = string.('a':'z') 
x = rand(v, 100) .* rand(v, 100) .* rand(v, 100) 

substring(x, 1, 2) 
# or 
substring(x, 1, s) 

ich den Fehler:

MethodError: no method matching substring(::Array{String,1}, ::Int64, ::Array{Int64,1}) 
Closest candidates are: 
    substring(::Array{String,N}, ::Integer, !Matched::Integer) at untitled-e3b9271a972031e628a35deeeb23c4a8:2 
    substring(::Array{String,1}, ::Integer, !Matched::Array{Integer,1}) at untitled-e3b9271a972031e628a35deeeb23c4a8:13 
    substring(::Array{String,N}, ::Integer, !Matched::Array{Integer,N}) at untitled-e3b9271a972031e628a35deeeb23c4a8:13 
    ... 
in include_string(::String, ::String, ::Int64) at eval.jl:28 
in include_string(::Module, ::String, ::String, ::Int64, ::Vararg{Int64,N}) at eval.jl:32 
in (::Atom.##53#56{String,Int64,String})() at eval.jl:50 
in withpath(::Atom.##53#56{String,Int64,String}, ::Void) at utils.jl:30 
in withpath(::Function, ::String) at eval.jl:38 
in macro expansion at eval.jl:49 [inlined] 
in (::Atom.##52#55{Dict{String,Any}})() at task.jl:60 

Ich sehe, dass es eine andere ist post addressing ein ähnlicher Fehler mit dem Typ Vector{String}. Mein Beitrag fragt auch eine Antwort auf den Fehler Vector{Integer}. Ich glaube, die Antworten darauf könnten für andere wie mich hilfreich sein, die die Implementierung abstrakter Typen als neu und schwierig empfinden.

+2

Mögliches Duplikat des [Vector {AbstractString} -Funktionsparameters akzeptiert keine Eingabe von Vector {String} in Julia] (http://stackoverflow.com/questions/21465838/vectorabstractstring-function-parameter-wont-accept-vectorstring-) Eingabe-in-j) –

+2

Dies ist ein Beispiel für parametrische Invarianz. Siehe http://stackoverflow.com/questions/21465838/vectorabstractstring-function-parameter-wont-accept-vectorstring-input-in-j für s ähnliches Problem; Hier liegt Ihr Problem in 'Vector {Integer}'. –

+0

Ich möchte darauf hinweisen, dass meine Frage als Typ-Management-Problem interpretiert wurde. Ich suche wirklich nur nach einer Funktion, die das tut, was der Titel sagt. In R, für das ich mehr gewöhnt bin, ist die Antwort trivial, substr (x, 1,2).Ich habe den obigen Code hinzugefügt, um zu zeigen, dass ich mich selbst um eine angemessene Lösung bemüht habe. Und wenn es nicht zu viel Mühe wäre, würde ich eine Antwort sehr schätzen. – fsmart

Antwort

3

Wenn Sie auf Julia 0,6, das ist ziemlich einfach zu tun mit SubString.(strs, starts, ends):

julia> SubString.(["asdf"], [1, 2, 3], [2, 3, 4]) 
3-element Array{SubString{String},1}: 
"as" 
"sd" 
"df" 
:

julia> SubString.("asdf", 2, 3) 
"sd" 

julia> SubString.(["asdf", "cdef"], 2, 3) 
2-element Array{SubString{String},1}: 
"sd" 
"de" 

julia> SubString.("asdf", 2, [3, 4]) 
2-element Array{SubString{String},1}: 
"sd" 
"sdf" 

auf Julia 0,5, Sie die gleiche Sache tun, aber Sie müssen die Zeichenfolge in einem Vektor wickeln (dh es kann nicht als eine einzige skalare gelassen werden)

Der Hauptunterschied zwischen Julia und R ist, dass während in R, Funktionen sind in der Regel auf Vektoren standardmäßig arbeiten (Broadcast), in Julia Sie explizit das Broadcasting-Verhalten mit einem sogenannten "Dot-Call", dh f.(x, y, z).

1

Nur um das explizit zu machen, denke, es ist eine super gemeinsame Sache zu denken.

Obwohl Int64 <: Integer gilt

Array{Int64,1} <: Array{Integer,1} ist es nicht!


Die docs on parametric-composite-types im Detail zu erklären, warum. Aber um es grundlegend zu umschreiben, weil das erstere eine spezifische Repräsentation im Speicher hat (d. H. Viele zusammenhängende 64-Bit-Werte), während das Array{Integer,1} Sätze von Zeigern auf separat zugewiesene Werte sein müssen, die 64 Bits sein können oder nicht.

Siehe ähnlich Q & A für die coole neue Syntax, die Sie für die Deklaration von Funktionen in julia 0,6 w/Hinweis auf diese verwenden: Vector{AbstractString} function parameter won't accept Vector{String} input in julia

+0

Würde es Ihnen etwas ausmachen, mir zu zeigen, wie Sie den Code ändern würden, damit er funktioniert? – fsmart

Verwandte Themen