在Julia中将DataArrays和Arrays作为参数的函数

时间:2014-06-24 09:48:16

标签: arrays function parameters julia

我想编写一个可以在Julia中同时使用DataArray和标准数组的函数。实际上,我想写一个函数的方法 - 一个采用两个类似矢量的结构作为参数,一个采用两个类似矩阵的参数。

由于Arrays和DataArrays基本相同,只有DataArray允许NA值,我真的不想写每个函数的4个版本,只是为了包含Array和DataArray参数的所有不同组合。现在,我使用以下六个(!)函数来实现我的目标:

function covar_to_intensity{T<:Number}(covariates::Array{T, 1}, coefficients::Array{T, 1})
  try
    return(exp(covariates' * coefficients)[1])
  catch
    error("Multiplication of covariates and coefficients not possible.")
  end
end

function covar_to_intensity{T<:Number}(covariates::Array{T, 2}, coefficients::Array{T, 2})
  try
    return(exp(covariates * coefficients))
  catch
    error("Multiplication of covariates and coefficients not possible.")
  end
end

function covar_to_intensity{T<:Number}(covariates::DataArray{T, 1}, coefficients::DataArray{T, 1})
  try
    return(exp(covariates' * coefficients)[1])
  catch
    error("Multiplication of covariates and coefficients not possible.")
  end
end

function covar_to_intensity{T<:Number}(covariates::DataArray{T, 2}, coefficients::DataArray{T, 2})
  try
    return(exp(covariates * coefficients))
  catch
    error("Multiplication of covariates and coefficients not possible.")
  end
end

function covar_to_intensity{T<:Number}(covariates::Array{T, 1}, coefficients::DataArray{T, 1})
  try
    return(exp(covariates' * coefficients)[1])
  catch
    error("Multiplication of covariates and coefficients not possible.")
  end
end

function covar_to_intensity{T<:Number}(covariates::Array{T, 2}, coefficients::DataArray{T, 2})
  try
    return(exp(covariates * coefficients))
  catch
    error("Multiplication of covariates and coefficients not possible.")
  end
end

我知道这可能是计算这些产品的低效方式,但我对如何编写同时使用Arrays和DataArrays的函数也有一般的兴趣。

谢谢!

1 个答案:

答案 0 :(得分:2)

通常,您可以为AbstractArray定义方法:

function covar_to_intensity{T<:Number}(covariates::AbstractVector{T}, coefficients::AbstractVector{T})
  try
     return exp(covariates * coefficients)
  catch
    error("Multiplication of covariates and coefficients not possible.")
   end
end

function covar_to_intensity{T<:Number}(covariates::AbstractMatrix{T}, coefficients::AbstractMatrix{T})
  try
     return exp((covariates' * coefficients)[1])
  catch
    error("Multiplication of covariates and coefficients not possible.")
   end
end