私は以下のように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] 'だけでエラーが出ますが、' = KeyVal(1,2) 'は問題なく動作しますが、ゼロ拡張が最も便利です。 –
エラーにより、未定義の参照へのアクセスが防止されます。 'immutable'型の場合、エラーはスローされず、ユニット化された行列はランダム値で埋められることに注意してください。 – tim
しかし、インスタンスが1つしかないので、ゼロ()アプローチに問題があります。m [i、j]の値を変更したい場合は、他の場所でもすべてのインスタンスが変更されます。 –