我正在尝试Julia
,我想写一个类似于Python
class
的struct
,它计算两个数组的均方根误差(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)