2

私は以下のようにKeyValと呼ばれる定義された自分のタイプを作っています:ジュリア:自己定義型の空/初期化多次元配列を作る

type KeyVal 
    first::Int 
    second::Float64 
end 

そして私は、空/またはゼロ行列で初期化をしようとしています要素のタイプがKeyValであること。 は、通常、他のタイプと私は

myMat = zeros(KeyVal, (10,3)) 

を行う。しかし、この複合型に定義されたzerosがないので、これは、動作しません。だから私は、次のように私自身のゼロ関数を定義しよう:

import Base.zeros 

function zeros(KeyVal,dims) 
    if length(dims) > 1 
     n=dims[1] 
     m=dims[2] 
     temp = repeat([KeyVal(0,0.0)], outer=m*n) 
     temp = reshape(temp, (n,m)) 
     return temp 
    elseif length(dims) == 1 
     n=dims[1] 
     temp= repeat([KeyVal(0,0.0)], outer=n) 
     temp = reshape(temp, (n)) 
     return temp 
    end 
end 

これは、他の以前に定義されたzerosのメソッドリストに追加されます。 しかし、それはエラーが発生します使用:

myMat = zeros(KeyVal, (N,M)) 

MethodError: no method matching zero(::Type{KeyVal}) 
Closest candidates are: 
    ..... 

は、私は方法でこれを解決するか、多分タイプKeyValを必要とするすべてのデータ構造は=最初(で初期化されるように、型コンストラクタでこれに信号を送ることができるかどうかを疑問に思って0、秒= 0.0)。そのすべての要素が#undefであり、この場合には、私はmyMat2の要素のいずれかにアクセスすることはできませんを除いてこれは行列が作成されます

myMat2 = Array{KeyVal,(N,M)} 

myMat2[1,1] 
UndefRefError: access to undefined reference 

は、以前私がようなマトリックスを定義してみました

答えて

2

あなたは

であらゆるタイプ Tと次元 Nの初期化されていない配列を作成することができます1と2次元配列の特殊な場合には

、あなたは、VectorMatrix、例えば、

julia> m = Matrix{KeyVal}(2,2) 
2×2 Array{KeyVal,2}: 
#undef #undef 
#undef #undef 

あなたはその後、例えば、いつものように要素を設定することができ、エイリアスを使用することができます

m[1,2] = KeyVal(1,2) 

タイプがzeroメソッドを実装する意味がある場合は、定義することができます

Base.zero(::Type{KeyVal}) = KeyVal(0,0) 

zeros正しく

julia> zeros(KeyVal, (2,2)) 
2×2 Array{KeyVal,2}: 
KeyVal(0,0.0) KeyVal(0,0.0) 
KeyVal(0,0.0) KeyVal(0,0.0) 

警告動作する:

zerosが同じインスタンスのコピーを有する配列を埋めfill!を使用します。代わりに、以下の解説または参照を含まない不変型を使用してください(isbitsは真です)。後者のアプローチは、配列が1つの連続したメモリブロックとして格納できるため、同様に高速になる可能性があります。その場合はzeroの代わりにfill(KeyVal(0,0), dims..)を直接使用することもできます。 0.6では、新しいstructキーワードはデフォルトで不変型を作成します。

編集:

別の可能性便宜上

julia> m = [KeyVal() for i=1:3, j=1:2] 
3×2 Array{KeyVal,2}: 
KeyVal(0,0.0) KeyVal(0,0.0) 
KeyVal(0,0.0) KeyVal(0,0.0) 
KeyVal(0,0.0) KeyVal(0,0.0) 

理解を使用することで、私は以前に、外側コンストラクタを興味深いことに `M [1を実行

KeyVal() = KeyVal(0,0) 
+0

おかげで、定義2] 'だけでエラーが出ますが、' = KeyVal(1,2) 'は問題なく動作しますが、ゼロ拡張が最も便利です。 –

+1

エラーにより、未定義の参照へのアクセスが防止されます。 'immutable'型の場合、エラーはスローされず、ユニット化された行列はランダム値で埋められることに注意してください。 – tim

+0

しかし、インスタンスが1つしかないので、ゼロ()アプローチに問題があります。m [i、j]の値を変更したい場合は、他の場所でもすべてのインスタンスが変更されます。 –

関連する問題