2017-04-11 16 views
1

サブセット値IntegerVector{Integer}の組み合わせを使用して、JuliaでVector{String}をサブセット化しようとしています。私は、基本的にの3つの引数のそれぞれをベクトルまたはシングルトンのいずれかにして、"asdf"[1:3]のサブセットを可能にする関数を記述したいと考えています。Juliaの文字列ベクトル内の要素をサブセット化するためにベクトルを使用する

これは私がこれまで試みられてきたものである:

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 

はそれを使用しようとすると:

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

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

私はエラーを取得する:

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 

私は別があることがわかりpost addressing同様のエラーVector{String}のエラー。私の投稿はまた、Vector{Integer}に関連するエラーへの応答を求めています。抽象的な型の実装が斬新で難しいと感じる私のような人にとっては、その応答が役立つかもしれないと私は信じている。

+2

[Vector {AbstractString}関数のパラメータの重複がjuliaのVector {String}入力を受け付けません](http://stackoverflow.com/questions/21465838/vectorabstractstring-function-parameter-wont-accept-vectorstring- input-in-j) –

+2

これはパラメトリックな不変量の例です。同様の問題については、http://stackoverflow.com/questions/21465838/vectorabstractstring-function-parameter-wont-accept-vectorstring-input-in-jを参照してください。ここであなたの問題は 'Vector {Integer}'にあります。 –

+0

私の質問はタイプ管理の問題として解釈されていますが、私は本当にタイトルが言っていることをする機能を探しています。私がもっと慣れ親しんだRでは、答えは簡単です、 'substr(x、1,2)'。私は自分自身で問題を解決するために妥当な努力をしたことを示すために上記のコードを含めました....そして、あまりにも厄介でなければ、私は本当に答えに感謝します。 – fsmart

答えて

3

あなたはジュリア0.6にしている場合、これは使用して行うことはとても簡単ですSubString.(strs, starts, ends):ジュリア0.5で

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" 

、あなたは同じことを行うことができますが、ベクトル(すなわち、それは単一のスカラーとして残すことができない)で文字列を囲む必要があります。

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

JuliaとRの主な違いは、Rの中では、関数は通常、デフォルトで(ベクトル化された)ベクトルで動作するように作られているということであり、Juliaでは、いわゆる "ドットコール" f.(x, y, z)

1

これを明示的なものとして考えてみましょう。 Int64 <: Integer

Array{Int64,1} <: Array{Integer,1}真であるにもかかわらず

ではありません!


docs on parametric-composite-typesは、その理由を詳しく説明しています。ただし、Array{Integer,1}は64ビットであってもなくても別々に割り当てられた値へのポインタのセットでなければならないのに対し、前者のArray{Int64,1}はメモリ内の特定の表現(すなわち多くの連続する64ビット値)を有するからである。

あなたはこれについてのw /ジュリア0.6関数を宣言するために使用することができますクールな新しい構文については、同様のQ & Aを参照してください:Vector{AbstractString} function parameter won't accept Vector{String} input in julia

+0

コードを変更して動作させる方法を教えていただけますか? – fsmart

関連する問題