我正在创建一种自己的类型,名为KeyVal
,如下所定义:
type KeyVal
first::Int
second::Float64
end
我正在尝试创建一个元素类型为KeyVal
的空矩阵或初始化为零。
通常我会使用其他类型:
myMat = zeros(KeyVal, (10,3))
但是这样不起作用,因为这个复合类型没有定义
zeros
。所以我尝试按照以下方式定义自己的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
的任何数据结构都会初始化为(first=0,second=0.0)。
之前我试过将矩阵定义为:
myMat2 = Array{KeyVal,(N,M)}
这将创建矩阵,但是所有元素都是#undef
,在这种情况下我无法访问myMat2
的任何元素:
myMat2[1,1]
UndefRefError: access to undefined reference
m[1,2]
会导致错误,但是= KeyVal(1,2)
完全正常,但零扩展是最方便的解决方案。 - A.Yazdihazeros
是使用fill!
实现的,它用相同的实例填充数组。使用我的编辑中的推导式或不可变类型代替。后一种方法可能也具有更高的性能。 - tim