我的问题 - 第1部分:测试浮点数是否为"整数"(在Matlab中)的最佳方法是什么?
我对第1部分的当前解决方案:显然isinteger是,因为这会测试元素的类型而不是值,所以目前我解决了这样的问题:
abs(round(X) - X) <= sqrt(eps(X))
Run Code Online (Sandbox Code Playgroud)
但也许有更原生的Matlab方法?
我的问题 - 第2部分:如果我目前的解决方案确实是最好的方法,那么我想知道是否存在推荐的一般容差?正如你从上面所看到的,我使用了sqrt(eps(X)),但我没有任何充分的理由.也许我应该使用eps(X),或者也许5 * eps(X)?任何建议都是最受欢迎的.
示例:在Matlab中,sqrt(2)^2 == 2返回False.但实际上,我们可能希望逻辑条件返回True.我们可以做到这一点使用上述方法,因为sqrt(2)^2实际上等于2 + eps(2)(即良好的公差范围内sqrt(eps(2)).但是,这是否意味着我应该总是用eps(X)我的宽容,或者是有充分的理由来使用更大的宽容,比如5 * eps(X),或sqrt(eps(X))?
更新(2012-10-31): @FakeDIY指出我的问题部分与此SO问题重复(道歉,不知道我在初始搜索中是如何错过的).鉴于此,我想强调问题的"容忍"部分(在该链接中没有涉及),即是eps(X)一种明智的容忍,或者我应该使用更大的东西5 * eps(X),如果是,为什么呢?
更新(2012-11-01):感谢大家的回复.因为我觉得它们对问题的各个方面都有意义,所以我对所有三个答案都进行了+1.我正在给Eric Postpischil一个答案,因为答案确实很好地解决了问题的容忍部分(并且在这个时间点它有最多的赞成).
我想在Julia中使用它时将高频金融数据存储在内存中.
我的数据有很多Float64数组.在某些市场上,为了某些安全性,每个阵列都存储一天内的高频数据.例如,对于在纽约证券交易所(纽约证券交易所)上市的IBM 2010-01-04日期,有一个Float64数组.
如上所述,我有许多这样的阵列,涵盖多个日期,市场和证券.我想将它们全部存储在一个对象中,这样可以很容易地检索任何给定的数组(可能利用元数据的树状结构).
在Matlab中,我曾经将它存储在一个结构中,其中第一级是市场,下一级是安全,下一级是日期,然后在树的末尾是相应的数组.在每个级别,我还存储了该级别的字段列表.
Julia实际上没有Matlab结构,所以在Julia中最好的方法是什么?
目前,我能想到的最好的是一系列嵌套复合类型,每个类型都有两个字段.例如:
type HighFrequencyData
dateList::Array{Date, 1}
dataArray::Array{Any, 1}
end
Run Code Online (Sandbox Code Playgroud)
其中dateList存储有对应于举行Float64的阵列序列日期的列表dataArray(即,dateList与dataArray将具有相同的长度).然后:
type securitiesData
securityList::Array{String, 1}
highFrequencyArray::Array{Any, 1}
end
Run Code Online (Sandbox Code Playgroud)
其中securityList存储了与HighFrequencyData所持有的类型序列相对应的证券列表highFrequencyArray.然后:
type marketsData
marketList::Array{String, 1}
securitiesArray::Array{Any, 1}
end
Run Code Online (Sandbox Code Playgroud)
其中marketList存储了与securitiesData所持有的类型序列相对应的市场列表securitiesArray.
鉴于此,所有数据现在都可以存储在类型变量中,并在每个嵌套级别marketsData使用marketList,和查找.securityListdateList
但这感觉有点麻烦......
在朱莉娅,我有这样的功能:
function f(x::Float64, c::Float64)
if x <= 0
return(0.0)
elseif x <= c
return(x / c)
else
return(1.0)
end
end
Run Code Online (Sandbox Code Playgroud)
该函数是类型稳定的,因此可以快速运行.但是,我希望将该函数包含在一个包中以进行常规分发,包括32位计算机.这里的最佳做法是什么?我应该为其编写另一个版本的函数Float32(如果我有很多这样的函数,这可能会很烦人)?我可以使用FloatingPoint输入类型吗?如果我这样做,我怎么保证功能型保持稳定,因为0.0和1.0有Float64,而x / c可能是Float32或Float16?也许我可以使用类型参数,例如T<:FloatingPoint然后让x::T和c::T,然后在函数体中使用0.0::T和1.0::T确保它是类型稳定的?
这里的任何指导将不胜感激.
我有一根绳子x。我认为这x是 的子类型类型的字符串表示形式Number。例如,x可能采用值"Float64"。我可以使用以下方法检查这一点:
eval(parse(x)) <: Number
Run Code Online (Sandbox Code Playgroud)
然而,它可能x包含一些危险的东西,比如 的一些变体"rm(something_important)",所以eval在我确定x安全之前使用是一个坏主意。
有什么方法可以安全地检查是否x是 的子类型的字符串表示形式Number?
(除了构建所有可能子类型的字符串数组Number并进行比较......)
我有一些缺少值的浮点数组,因此其类型为Array{Union{Missing, Float64},1}。是否有将非缺失部分转换为的命令Array{Float64,1}?
如果我有一个简单的矩阵
A = [1 3 ; 4 3 ; 6 12]
Run Code Online (Sandbox Code Playgroud)
然后去
A(:,3) = (A(:,1)+A(:,2))
Run Code Online (Sandbox Code Playgroud)
然后第3列中的每个元素都将包含第1列和第2列中对应元素的总和.
但是,当我走的时候
A(:,3) = (A(:,1)/A(:,2))
Run Code Online (Sandbox Code Playgroud)
我收到一条错误消息,Subscripted assignment dimension mismatch.谷歌搜索没有透露对此错误消息的启发性解释.这里有人可以帮忙吗?