我有以下Julia代码,我想并行化它.
using DistributedArrays
function f(x)
return x^2;
end
y = DArray[]
@parallel for i in 1:100
y[i] = f(i)
end
println(y)
Run Code Online (Sandbox Code Playgroud)
输出是DistributedArrays.DArray[]
.我希望y的值如下:y=[1,4,9,16,...,10000]
请参阅julia-lang文件:
hist(v [,n])→e,计数
计算v的直方图,可选地使用大约n个区间.返回值是范围e,其对应于箱的边缘,并且计数包含每个箱中的v的元素的数量.注意:Julia不会忽略计算中的NaN值.
我选择了一个样本范围的数据
testdata=0:1:10;
Run Code Online (Sandbox Code Playgroud)
然后使用hist函数计算1到5个bin的直方图
hist(testdata,1) # => (-10.0:10.0:10.0,[1,10])
hist(testdata,2) # => (-5.0:5.0:10.0,[1,5,5])
hist(testdata,3) # => (-5.0:5.0:10.0,[1,5,5])
hist(testdata,4) # => (-5.0:5.0:10.0,[1,5,5])
hist(testdata,5) # => (-2.0:2.0:10.0,[1,2,2,2,2,2])
Run Code Online (Sandbox Code Playgroud)
如你所知,当我想要1个bin时,它会计算2个bin,当我想要2个bin时,它会计算3个.
为什么会这样?
请参阅Julia doc:
在Julia中,函数的所有参数都通过引用传递.
当我从匿名函数中获取Float64参数的内存地址时,它看起来是正确的.但对于命名函数来说并非如此.
test = function (a::Float64)
println(pointer_from_objref(a));
end
# => (anonymous function)
function test1(a::Float64)
println(pointer_from_objref(a));
end
# => test1 (generic function with 1 method)
value=0.0;
println(pointer_from_objref(value))
# => Ptr{Void} @0x00007fe797c5c020
test(value)
# => Ptr{Void} @0x00007fe797c5c020
test1(value)
# => Ptr{Void} @0x00007fe799e83960
Run Code Online (Sandbox Code Playgroud)
正如@Gnimuc所提到的,Julia-Lang Doc还有另一段解释了Argument Passing Behavior
Julia函数参数遵循有时称为"pass-by-sharing"的约定,这意味着值在传递给函数时不会被复制.函数参数本身充当新的变量绑定(可以引用值的新位置),但它们引用的值与传递的值相同.
这种"传递共享"行为与上述代码之间是否存在任何关系?
是否可以在c ++中使用julia语言?julia语言是否提供了一些库?
现在,我正在尝试在我的c ++项目中使用julia语言的一些功能.这可能吗?我能做什么?
提前致谢.
我正试图找到在Julia中使用终结器的正确方法
请参阅Julia文档:
终结者(x,函数)
当没有程序可访问的x引用时,注册要调用的函数f(x).如果x是位类型,则此函数的行为是不可预测的.
首先,我使用TestModule.jl生成了一个TestModule标准包
#in TestModule.jl
module TestModule
end
finalizer(TestModule,(t)->println("fin"))
Run Code Online (Sandbox Code Playgroud)
还有一个runtest.jl
#in runtest.jl
using Base.Test
using TestModule
Run Code Online (Sandbox Code Playgroud)
然后我尝试测试Package但是在测试通过时我收到了ERROR:
julia> Pkg.test("TestModule")
INFO: Testing TestModule
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF
jl_uv_writecb() ERROR: bad file descriptor EBADF …
Run Code Online (Sandbox Code Playgroud) 我有这个简单的方法来计算向量集合的加权平均值
function meanw{T <: Number}(x::AbstractArray{AbstractVector{T}, 1}, w::AbstractVector{T})
x? = sum(x .* w)
x? = map(z -> z - x?, x)
x?, x?
end
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用它时,调度与我的方法不匹配.
ERROR: `meanw` has no method matching meanw(::Array{Array{Float64,1},1}, ::Array{Float64,1})
Run Code Online (Sandbox Code Playgroud)
我怀疑在涉及嵌套时我误解了如何使用类型限制.我应该如何重写此功能以匹配我的收藏?
PS
我知道矢量和数组是相同的,但差异化使得函数的使用更加清晰.
只需从文档中复制:
pointer_from_objref(object_instance):
生成的Ptr的存在不会保护对象不被垃圾收集,因此您必须确保在Ptr将被使用的整个时间内对象保持引用.
参考文献{T}:
安全引用类型T数据的对象.此类型保证指向正确类型的有效Julia分配内存.只要引用了Ref本身,就可以保护底层数据不被垃圾收集器释放.
当作为ccall参数传递时(作为Ptr或Ref类型),Ref对象将转换为指向它引用的数据的本机指针.
没有无效(NULL)参考.
我想传递一个指向ac函数的指针.根据文档,似乎使用pointer_from_objref
并不总是安全的,所以我尝试使用Ref
:
# test 1
bufferID = convert(GLuint, 0)
glGenBuffers(1, pointer_from_objref(bufferID))
@show bufferID
out => bufferID = 0x00000001 # ok
# test 2
bufferID = convert(GLuint, 0)
glGenBuffers(1, Ref(bufferID))
@show bufferID
out => bufferID = 0x00000000 # unexpected result
# test 3
bufferID = GLuint[0]
glGenBuffers(1, Ref(bufferID))
@show bufferID[]
out => bufferID[] = 0x00000001 # ok
Run Code Online (Sandbox Code Playgroud)
结果显示,test 2
没有任何错误会产生意外结果,但test 3
在转换bufferID
为数组时工作正常.
我的问题是为什么test 2 …