避免阵列分配有利于提高性能.但是,我还没有理解什么是最有效的方法,可以执行矩阵的QR分解A.(注意:需要Q和R矩阵)
简单地使用
Q, R = qr(A)
可能不是最好的主意,因为它分配Q和R,两者都可以重新分配.
该函数qrfact允许以打包格式存储因子分解.但是,我之后仍会写:
F = qrfact(A); Q = F[:Q]; R = F[:R]
再次为Q和分配新数组R.最后,文档还建议了该qrfact!函数,它通过覆盖输入A来节省空间,而不是创建副本.但是,如果一个人使用F = qrfact!(A)
覆盖写入A是没有用的,因为它不是,Q或者R哪一个(具体来说,我)需要.
所以我的两个问题是:
如果您只关心矩阵Q并且R重新分配它们没有问题,那么执行QR分解的最佳/最有效方法是什么?
A当一个人打电话时,矩阵中实际写的是什么qrfact!(A)?
我正在运行一个在Julia中进行数字ODE集成的程序.我正在运行Windows 10(64位),英特尔酷睿i7-4710MQ @ 2.50Ghz(8个逻辑处理器).
我注意到当我的代码在julia上运行时,只有最多30%的CPU在使用中.进入parallelazation文档,我开始使用Julia:
C:\Users\*****\AppData\Local\Julia-0.4.5\bin\julia.exe -p 8并期望看到改进.然而,我没有看到它们.
因此,我的问题如下:我是否有一种特殊的方式来编写代码以便更有效地使用CPU?这可能是我的操作系统(Windows 10)造成的限制吗?
我用以下命令在julia控制台中提交我的代码:
include("C:\\Users\\****\\AppData\\Local\\Julia-0.4.5\\13. Fast Filesaving Format.jl").
在这段代码中,我使用了一些额外的包:
using ODE; using PyPlot; using JLD.
我使用Windows"任务管理器"测量CPU使用率.
在我的 julia 代码中,我使用了一些常量。其中一些常量是字符串(它们用作标识符)。我的问题是,每当我运行 julia 脚本时,即使我没有更改常量,我总是会收到以下关于常量字符串的警告:
WARNING: redefining constant pot_type
为了说明我的问题,这是一个 MWE:
const pot_type = "constant"
const b = 12
println("Given parameters: Potential = $pot_type, b = $b .")
Run Code Online (Sandbox Code Playgroud)
如果我运行此脚本两次,我将收到上述警告。不仅如此,如果我只const something = "somestring"在 Julia 控制台中输入两次,也会发生同样的事情。我只是得到WARNING: redefining constant something。
我知道这不会以任何方式影响我的代码,但是无论如何要删除此警告或修复它?在我的实际代码中,每次我提交内容时它都会创建 5 行,这个空间可用于显示以前提交的输出。
编辑(让自己更清楚):问题是即使我没有重新定义常量,也会显示此警告消息,这意味着我给了它相同的值。而且,这个问题(据我所知)只存在于String,不存在于Int64或Float64类型。例如:如果我写const b = 1.2然后const b = 1.4我会按预期收到警告消息。现在,如果我写const b = 1.2然后const b = 1.2(相同的值),我将不会再如预期的那样收到警告。但是,这不适用于字符串常量。即使定义相同的值,您也会收到警告。
我想在 Makie 中制作一个双 yaxis,这样一个 y 轴在左边并有自己的值,另一个在右边并有自己的值,而它们共享 x 轴。
例如,要在 PyPlot 中执行此操作,请遵循https://matplotlib.org/gallery/api/two_scales.html并获得
这是如何在 Makie.jl 中完成的?如果答案可以说明如何为轴着色,那么我加倍!
我刚学完朱莉娅(最重要的是表演技巧!).我意识到使用全局变量会使代码变慢.对此的反措施是将尽可能多的变量传递给函数的参数.因此我做了以下测试:
x = 10.5 #these are globals
y = 10.5
function bench1() #acts on global
z = 0.0
for i in 1:100
z += x^y
end
return z
end
function bench2(x, y)
z = 0.0
for i in 1:100
z += x^y
end
return z
end
function bench3(x::Float64, y::Float64) #acts on arguments
z::Float64 = 0.0
for i in 1:100
z += x^y
end
return z
end
@time [bench1() for j in 1:100]
@time [bench2(x,y) for j in 1:100]
@time [bench3(x,y) …Run Code Online (Sandbox Code Playgroud) (我指的是 Julia 0.5)假设我定义了一个函数:
f{T<:Real}(x::T=one(T), y::T=one(T)) = x+y
我想在指定类型时调用它,但不通过参数指定它。例如,我想做:
f{Float64}()
在控制台中,这给出了错误:
ERROR: TypeError: Type{...} expression: expected Type{T}, got #f
那么,是否可以在函数调用期间{}使用语法来调用任何函数(除了参数类型的构造函数之外) ?
编辑:我提出这个问题的原因是因为我想使用默认参数,但同时也指定类型,例如f{BigFloat}().
julia ×6
performance ×2
constants ×1
function ×1
global ×1
optimization ×1
plot ×1
string ×1
types ×1
warnings ×1