获取UndefVarError: @属性未定义,而试图使用Julia结构计算RMSE



我正在尝试Julia,我想写一个类似于Pythonclassstruct,它计算两个数组的均方根误差(RMSE)。我写了以下Julia代码:

struct RMSE
_array1::Array
_array2::Array

function RMSE(array1::Array, array2::Array)
new(array1, array2)
end

# getter function for array1
function RMSE.array1(r::RMSE)
return r._array1
end

# setter function for array1
function RMSE.array1(r::RMSE, value::Array)
r._array1 = value
end

# getter function for array2
function RMSE.array2(r::RMSE)
return r._array2
end

# setter function for array2
function RMSE.array2(r::RMSE, value::Array)
r._array2 = value
end

# @property macro to for array1 and array2 with both a getter and a setter
@property array1()
@property array2()

# Calculating the RMSE between the array1 and array2
function RMSE.calculate(r::RMSE)
sum_squares = sum((r.array1 - r.array2).^2)
rmse = sqrt(sum_squares / length(r.array1))
return rmse
end
end
r = RMSE([1, 2, 3], [1, 2, 3])
r.array1 = [4, 5, 6]
r.array2 = [7, 8, 9]
rmse = r.calculate
println(rmse)

但是,我得到一个错误:

ERROR: LoadError: UndefVarError: @property not defined
in expression starting at /home/Julia/rmse_struct.jl:30
in expression starting at /home/Julia/rmse_struct.jl:1

我使用的是Julia 1.7.2,据我所知,@property是在Julia 0.7中引入的,所以应该没有问题。

我做错了什么?

与Python不同,您不必使用。对于使用Julia对象的函数调用,RMSE在这里应该是函数,而不是对象。您的代码将对象作为参数添加,但保留python的`。的RMSE,在这里不起作用。实际上,您需要的代码在Julia中要简单得多:

function RMSE(arr1, arr2)
@assert length(arr1) == length(arr2)
return sqrt(sum((arr1 .- arr2).^2) / length(arr1)) 
end
array1 = [4, 5, 6]
array2 = [7, 8, 9]
@show array1 array2 RMSE(array1, array2)

最新更新