小编xzc*_*czd的帖子

MATLAB的计时可靠吗?如果是的话,我们可以用 Julia、Fortran 等重现该性能吗?

最初这是mathematica.SE 中出现的一个问题,但由于讨论涉及多种编程语言,我认为最好稍微改一下措辞并将其发布在这里。

简而言之,michalkvasnicka在以下 MATLAB 示例中发现

s = 15000;
tic
% for-loop version
H = zeros(s,s);
for c = 1:s
    for r = 1:s
        H(r,c) = 1/(r+c-1);
    end
end
toc
%Elapsed time is 1.359625 seconds.... For-loop 

tic;
% vectorized version
c = 1:s;
r = c';
HH=1./(r+c-1);
toc
%Elapsed time is 0.047916 seconds.... Vectorized

isequal(H,HH)
Run Code Online (Sandbox Code Playgroud)

矢量化代码段比纯 for 循环代码段快 25 倍以上。虽然我无法访问 MATLAB,因此无法亲自测试示例,但时间1.359625似乎表明它是在普通 PC 上进行测试的,就像我的一样。

但我无法用 Fortran 或 Julia 等其他语言重现时间!(我们知道,他们俩都以数值计算的性能而闻名。好吧,我承认我绝不是 fortran 或 julia 的专家。)

以下是我用于测试的样本。我使用的是配备 i7-8565U CPU、Win 10 …

math performance matlab vectorization julia

10
推荐指数
2
解决办法
338
查看次数

如何设置DArray元素的值?

我正在探索Julia的并行计算,并尝试了这个:

a=dzeros(5);a[1]=5
Run Code Online (Sandbox Code Playgroud)

但只是得到了这个错误:

setindex! not defined for DArray{{Float64, 1, Array{Float64, 1}}
Run Code Online (Sandbox Code Playgroud)

好吧,我认为手册说setindex!是完全实现的DArray.我错过了什么?

我在Windows 32位上使用v0.2.1.

julia

5
推荐指数
1
解决办法
657
查看次数

如何提高这段代码的性能?

我正在尝试学习一点Julia,在阅读了几个小时的手册之后,我写了下面这段代码:

ie = 200;
ez = zeros(ie + 1);
hy = zeros(ie);

fdtd1d (steps)=
    for n in 1:steps
        for i in 2:ie
            ez[i]+= (hy[i] - hy[i-1])
        end
        ez[1]= sin(n/10)
        for i in 1:ie
            hy[i]+= (ez[i+1]- ez[i])
        end
    end

@time fdtd1d(10000);
Run Code Online (Sandbox Code Playgroud)
 elapsed time: 2.283153795 seconds (239659044 bytes allocated)
Run Code Online (Sandbox Code Playgroud)

我相信它在优化之下,因为它比相应的Mathematica版本要慢得多:

ie = 200;
ez = ConstantArray[0., {ie + 1}];
hy = ConstantArray[0., {ie}];

fdtd1d = Compile[{{steps}}, 
   Module[{ie = ie, ez = ez, hy = hy}, 
    Do[ez[[2 ;; ie]] += (hy[[2 …
Run Code Online (Sandbox Code Playgroud)

wolfram-mathematica julia

4
推荐指数
1
解决办法
414
查看次数