给定 Julia 中的一些对角矩阵,例如A = Diagonal(rand(3,3)),有什么方法可以创建一个一维数组,其元素是这个对角矩阵的对角线条目A?
我尝试在julia命令中运行以下函数,但是在对函数进行计时时,我看到了太多的内存分配,我无法弄清楚为什么.
function pdpf(L::Int64, iters::Int64)
snr_dB = -10
snr = 10^(snr_dB/10)
Pf = 0.01:0.01:1
thresh = rand(100)
Pd = rand(100)
for m = 1:length(Pf)
i = 0
for k = 1:iters
n = randn(L)
s = sqrt(snr) * randn(L)
y = s + n
energy_fin = (y'*y) / L
@inbounds thresh[m] = erfcinv(2Pf[m]) * sqrt(2/L) + 1
if energy_fin[1] >= thresh[m]
i += 1
end
end
@inbounds Pd[m] = i/iters
end
#thresh = erfcinv(2Pf) * sqrt(2/L) + 1
#Pd_the = 0.5 …Run Code Online (Sandbox Code Playgroud) 在我最初在MATLAB中编写(并优化)它之后,我在Fortran中编写了着名的谱 - 范数算法.天真转换到Fortran之后的加速至少是18倍,但问题是Fortran程序的输出不准确.正确的输出应该是1.274224153我的Fortran程序输出1.273722712,我在Fortran中做错了什么?
program perf_spectralnorm
implicit none
integer, parameter :: n = 5500, dp = kind(0.d0)
real(dp) :: u(n) = 1, v(n), w(n), vBv, vv, res
integer :: i, j, nvec(n)
nvec = [(i, i=1,n)]
do i = 1,10
call Au(w, u) ! change w
call Atu(v, w) ! change v
call Au(w, v) ! change w
call Atu(u, w) ! change u
end do
vBv = dot_product(u, v)
vv = dot_product(v, v)
res …Run Code Online (Sandbox Code Playgroud) 我的问题很简单,Float朱莉娅有一个通用的类型吗?例如Integer,对于s 的情况,可以简单地编写Int,并且将Int32在32位系统或Int6464位系统中进行转换.但是对于Floats,请参阅下面的示例函数:
function bb(n)
b = Array{Float64}(n)
b[1] = 0.9999
for i = 2:n
@inbounds b[i] = b[i-1] * 0.9999
end
println(b[n])
end
bb(10^3)
@time bb(10^3)
@time bb(10^8)
Run Code Online (Sandbox Code Playgroud)
它提供以下时序结果以及总内存分配:
0.9048328935585562
0.9048328935585562
0.000100 seconds (135 allocations: 15.750 KB)
2.4703e-320
3.230642 seconds (14 allocations: 762.940 MB, 1.51% gc time)
Run Code Online (Sandbox Code Playgroud)
现在将第一行更改为b = Array{AbstractFloat}(n)并查看可笑的巨大时序和内存分配:
0.9048328935585562
0.9048328935585562
0.003564 seconds (2.13 k allocations: 46.953 KB)
2.4703e-320
351.068176 seconds (200.00 M allocations: 3.725 …Run Code Online (Sandbox Code Playgroud)