24小时热门版块排行榜    

CyRhmU.jpeg
查看: 3769  |  回复: 27

walk1997

金虫 (著名写手)

引用回帖:
7楼: Originally posted by chyanog at 2013-08-03 20:11:32
Compile一点也不鸡肋,并不是只能编译一些简单函数,一些数值计算程序可以提速30~100倍以上,但使用一些高级的函数时(NSolve,NIntegrate等)就没必要Compile了,不会有加速效果,
使用CompilationTarget -> & ...

闲着 又琢磨了下这个代码
我感觉完成这个功能mathematica本身的代码会这样
test2[m_] :=
  Position[FractionalPart@Sqrt@Array[(1.0 #1^2 + 1.0 #2^2) &, {m, m}],
  0.0];
(test2[1000] // Length)/2 // AbsoluteTiming
这样的代码速度大概比编译的慢5倍 (扣去本身重复计算了一半 大概是2-3倍 编译的效果还是明显 这里position大约花了一半的时间)
不知道mathematica本身的代码能否再优化下?
11楼2013-08-07 11:29:11
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

walk1997

金虫 (著名写手)

test3[m_] :=
  Position[FractionalPart@Sqrt@N@Array[(#1*#1 + #2*#2) &, {m, m}],
   0.0];

可以进一步提高下
12楼2013-08-07 11:32:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zdzqy

新虫 (小有名气)

引用回帖:
12楼: Originally posted by walk1997 at 2013-08-07 11:32:38
test3 :=
  Position;

可以进一步提高下

这个代码复制过来貌似乱了,能否给我发个nb的文件?
13楼2013-08-07 11:47:40
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

walk1997

金虫 (著名写手)

引用回帖:
13楼: Originally posted by zdzqy at 2013-08-07 11:47:40
这个代码复制过来貌似乱了,能否给我发个nb的文件?...

纯文本复制过来的
我没贴过文件

test3[m_]:=Position[FractionalPart@Sqrt@N@Array[(#1*#1+#2*#2)&,{m,m}],0.0];
(test3[1000]//Length)/2//AbsoluteTiming
{0.1404003,1034}
14楼2013-08-07 11:55:56
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

chyanog

金虫 (小有名气)

引用回帖:
12楼: Originally posted by walk1997 at 2013-08-07 11:32:38
test3 :=
  Position;

可以进一步提高下

可以提速的,向量化的方法也很快,和Compile后的速度可以一比,但是一个缺点是比较耗内存
CODE:
SparseArray[ 1 - Unitize@  FractionalPart@Sqrt@N@Array[#1^2 + #2^2 &, {1000, 1000}]][ "NonzeroPositions"] // Length // AbsoluteTiming

(*---------------------------*)
SparseArray[ 1 - Unitize@FractionalPart@Sqrt@N@(#1^2 + #2^2) & @@ {#, Transpose@#} &[ConstantArray[Range[1000], 1000]]][
   "NonzeroPositions"] // Length // AbsoluteTiming

15楼2013-08-07 11:56:26
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

walk1997

金虫 (著名写手)

引用回帖:
15楼: Originally posted by chyanog at 2013-08-07 11:56:26
可以提速的,向量化的方法也很快,和Compile后的速度可以一比,但是一个缺点是比较耗内存


SparseArray // Length // AbsoluteTiming

(*---------------------------*)
SparseArray[ 1 - Unitize@Fraction ...

谢谢指出
平常可能都不太注意怎么构建列表的效率 学习了
是的 比较耗内存
如果能直接一步构造出想要的列表就好
16楼2013-08-07 12:04:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

walk1997

金虫 (著名写手)

引用回帖:
15楼: Originally posted by chyanog at 2013-08-07 11:56:26
可以提速的,向量化的方法也很快,和Compile后的速度可以一比,但是一个缺点是比较耗内存


SparseArray // Length // AbsoluteTiming

(*---------------------------*)
SparseArray[ 1 - Unitize@Fraction ...

btw:
  想到一个问题 严格来说 这样求解出来可能会有错误
因为有可能a^2+b^2//N//Sqrt 可能非常非常接近整数
不知道在机器精度下 第一次出现错误的解会在哪里?
不知道存在不?
17楼2013-08-07 12:12:55
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

chyanog

金虫 (小有名气)

被Compile的函数也可以具有Listable属性,下面这两个函数编译前后相差大概50倍
CODE:
Clear["`*"]
mandel[a_, it_: 100] :=
  Module[{z = 0. I, c = a[[2]] + a[[1]] I},
   Catch[Do[If[Abs[z] > 2, Throw@i];
     z = z^2 + c;, {i, it}]; it]
   ];

mandelc =  Compile[{{a, _Real, 1}, {it, _Integer}},
   Module[{z = 0. I, c = a[[2]] + a[[1]] I},
    Catch[Do[If[Abs[z] > 2, Throw@i];
      z = z^2 + c;, {i, it}]; it]
    ], RuntimeAttributes -> {Listable}, RuntimeOptions -> "Speed"];

d1 = mandelc[Outer[List, Range[-1., 1, 2./199], Range[-2., 0.5, 2.5/199]], 100]; // AbsoluteTiming
d2 = Table[ mandel[{i, j}], {i, -1., 1, 2./199}, {j, -2., 0.5,  2.5/199}]; // AbsoluteTiming

d1 == d2
Colorize[#, ColorFunction -> Hue] & /@ {d1, d2}

18楼2013-08-07 12:15:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

chyanog

金虫 (小有名气)

引用回帖:
17楼: Originally posted by walk1997 at 2013-08-07 12:12:55
btw:
  想到一个问题 严格来说 这样求解出来可能会有错误
因为有可能a^2+b^2//N//Sqrt 可能非常非常接近整数
不知道在机器精度下 第一次出现错误的解会在哪里?
不知道存在不?...

这个不太清楚了,
19楼2013-08-07 12:25:17
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zdzqy

新虫 (小有名气)

引用回帖:
10楼: Originally posted by walk1997 at 2013-08-06 23:58:27
学习了  非常好的例子
函数内部的运算量/次数很大的时候 加速比较明显
也和运算的种类有关 编译成C 和编译成 WMV 也差个几倍...

真是谢谢二位的不吝赐教,但是说来说去,并没有说道解决问题的核心,我很诧异,这是求助帖。
20楼2013-08-07 15:16:38
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 zdzqy 的主题更新
信息提示
请填处理意见