编辑:基于额外的实验,我相当有信心减缓发生响应许多调用文件打开和关闭例程(h5open和close).我现在的时间有点短,但会在接下来的几天内回来添加更多的代码/细节.
使用Julia的HDF5软件包,我注意到h5write如果一个人对调用h5write和执行多次迭代,函数开始变慢h5read.有趣的是,似乎对于行为非常明显,人们应该在少量文件中读取和写入大量位置.我正在谈论的行为的演示可以通过启动Julia会话并运行以下子例程来获得(注意,您将需要HDF5包):
#Set parameters
numFile = 10;
numLocation = 10000;
writeDir = "/home/colin/Temp/";
FloatOut = 5.5;
#Import functions
using HDF5
#Loop over read/writes.
c1 = 1;
timeMat = Array(Float64, numFile * 2, 2);
for i in 1:numFile
filePath = string(writeDir, "f", string(i), ".h5");
for j in 1:numLocation
location = string("G1/L", string(j));
if j == 1 || j == numLocation; tic(); end;
h5write(filePath, location, FloatOut);
if j == 1 || …Run Code Online (Sandbox Code Playgroud) 为了生成随机矩阵,我使用了以下内容:
x =兰迪([ - 3,3],4)
但是我不希望输出矩阵中有任何零.我怎样才能做到这一点?
设置:我在Julia中有一个函数,它有两个输入,x和y.两个输入都是相同类型的数组,其中该类型可以是任何数字类型,Date,DateTime或String.注意,无论输入数组的上述任何元素类型如何,函数的内容都是相同的,所以我不想多次编写该函数.目前,我有这样定义的功能:
function MyFunc{T<:Number}(x::Array{T, 1}, y::Array{T, 1})
Run Code Online (Sandbox Code Playgroud)
显然,这会处理数字大小写,但不会处理Date,DateTime或String.
问题:在Julia编写函数的第一行以适应其他类型时,最佳做法是什么?注意,性能很重要.
我的尝试:我可以尝试类似的东西:
function MyFunc{T<:Number}(x::Union(Array{T, 1}, Array{Date, 1}, Array{DateTime, 1}, Array{String, 1}) y::Union(Array{T, 1}, Array{Date, 1}, Array{DateTime, 1}, Array{String, 1}))
Run Code Online (Sandbox Code Playgroud)
但这感觉很笨拙(或者可能不是?).
链接:我想这与我在Julia上的另一个Stack Overflow问题密切相关,可以在这里找到.
官方文件说:
连接和字符串插值调用
string()将对象转换为字符串形式
但是,以下最低工作示例似乎证明了其他情况:
type MyType
x::Int
end
import Base.string
Base.string(m::MyType) = "world"
m = MyType(4)
println("hello $m")
println("hello " * string(m))
Run Code Online (Sandbox Code Playgroud)
第二行最后一行评估为hello MyType(4)REPL,而最后一行评估(按预期)为hello world.
那么我做错了什么?
(我仍然在v0.4,但官方文档版本表明不应该有任何区别.)
更新:感谢@ rickhg12s指出看起来我可能偶然发现了一个错误.method_exists(<, (MyType, MyType))回来的true时候method_exists(isless, (MyType, MyType))正在回来false.我在v0.3.x但是@ rickhg12s是在v0.4的每晚构建,所以我将提出一个问题.
如何检查特定类型的方法是否存在?
我以为我可以这样做,例如:
method_exists(<, (Int, Int))
Run Code Online (Sandbox Code Playgroud)
这将返回,true因为为两个整数定义了小于比较.但是,当我定义自己的类型时:
type MyType; end
Run Code Online (Sandbox Code Playgroud)
然后尝试:
method_exists(<, (MyType, MyType))
Run Code Online (Sandbox Code Playgroud)
它返回true.但我认为它会回归false,因为:
a = MyType()
a < a
Run Code Online (Sandbox Code Playgroud)
抛出错误,因为<没有定义MyType.那么如何在运行时检测是否存在给定类型的方法?
给出一个Vector表示v和Matrix表示M,在Julia中计算矩阵二次型的最快方法是什么,即v'Mv?最优雅的是什么?
注意:我希望返回值为标量.有趣的是,如果v = rand(3)和M = rand(3, 3),则v'*M*v返回包含一个元素而不是标量的向量.我并没有期待这种行为,虽然已经阅读了足够多的github问题页面,怀疑这种行为有充分的理由让我觉得不够聪明.所以,显然(v'*M*v)[1]会做这个工作,只是想知道是否有更好的方法......
如果我们运行:
@code_warntype deepcopy(rand(2))
Run Code Online (Sandbox Code Playgroud)
在Julia REPL中,输出包含Body表达式中的标记值.具体来说,两个Any在结尾:
Body:
begin # deepcopy.jl, line 8:
GenSym(0) = (Base.Array)(Base.Any,32)::Array{Any,1}
return (Base.deepcopy_internal)(x::Array{Float64,1},$(Expr(:new, :((top(getfield))(Base,:ObjectIdDict)::Type{ObjectIdDict}), GenSym(0))))::Any
end::Any
Run Code Online (Sandbox Code Playgroud)
我从这个问题中了解到,如果主要关注的是类型不稳定,我们通常不需要担心Body表达式中的标记值.相反,我的问题是:
为什么Base生成任何标记值的相当简单的函数@code_warntype?我确信有充分的理由,但我是新解释的输出@code_warntype,并且在从官方文档中理解Body表达式的讨论时遇到了一些麻烦.
我们可以在julia中将一个函数作为另一个函数的参数传递吗?它是如何工作的?这是否意味着输入函数先于调用函数运行,还是仅在调用函数专门调用输入函数时才调用输入函数?
在朱莉娅,我有这样的功能:
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确保它是类型稳定的?
这里的任何指导将不胜感激.
Julia的文档表明,写出if语句的有效捷径就是语法
<cond> && <statement>
Run Code Online (Sandbox Code Playgroud)
我已经将这些用于错误消息,例如length(x) < N && error("x is too short"),它按预期工作.但是,以下不起作用:
x = 3
x < 4 && x = 5
Run Code Online (Sandbox Code Playgroud)
我收到表单的错误syntax: invalid assignment location.这里发生了什么?
我要做的是检查是否x小于4,如果是,则设置x为5.我应该做以下事情吗?
if x < 4
x = 5
end
Run Code Online (Sandbox Code Playgroud)
这种情况是否有有效的短路方法?