一个数组的编译问题
mathematica吧
全部回复
仅看楼主
level 8
jiaoeyushushu 楼主
各位前辈,编译小白请教一个问题。
n = 300;
dat = Table[{1. i, j, .5 i}, {i, n}, {j, n}];
list = Table[If[i >= j, {i, j}, Nothing], {i, n - 1}, {j, n}];
f[dat_, list_] :=
Module[{dat0 = dat, p},
p[l_] := Plus @@ Sqrt[Plus @璐村惂鐢ㄦ埛_053SRMK馃惥 (# - Plus @@ l/Length[l] & /@ l)^2];
p /@ Apply[dat0[[##]] &, list, {2}]];
f[dat, list] // AbsoluteTiming
请问这个函数f可以编译吗?f每次输出一个大列表dat(固定维数)和一串list,list的行数一定但列数不定。f的作用其实类似于每次从大列表dat里取出list中所示位置的元素做方差。我看Total,Mean好像不能编译,是不是就不能出现在要编译的函数里啊?所以p这个写的很是奇怪。
谢谢各位前辈指点。
2019年09月23日 06点09分 1
level 8
jiaoeyushushu 楼主
前排
粉丝呼叫@无影东瓜 ,瓜哥可以抽空看一下咩。[乖][勉强]
2019年09月23日 06点09分 2
吧务
level 12
In[226]:= n = 300;
dat = Table[{1. i, j, .5 i}, {i, n}, {j, n}];
list = Table[If[i >= j, {i, j}, Nothing], {i, n - 1}, {j, n}];
f[dat_, list_] :=
Module[{p},
p[l_] := Plus @@ Sqrt[Plus @璐村惂鐢ㄦ埛_053SRMK馃惥 (# - Plus @@ l/Length[l] & /@ l)^2];
p /@ Apply[dat[[##]] &, list, {2}]];
ans1 = f[dat, list]; // AbsoluteTiming
cp = Compile[{{l, _Real, 2}},
Total@Sqrt[Total /@ (# - Mean[l] & /@ l)^2]
];
f2[dat_, list_] := cp /@ Apply[dat[[##]] &, list, {2}];
ans2 = f2[dat, list]; // AbsoluteTiming
ans1 == ans2
Out[230]= {2.58979, Null}
Out[233]= {0.108933, Null}
Out[234]= True
Total和Mean都是可以编译的,CompilePrint一下看看就知道了,只要没有MainEvaluate就是编译成功了。其他具体的懒得打太多字解释了,你自己看下吧,有哪不明白再问
另外如果你的list对应的dat中元素位置是规律的,完全可以直接写,可读性和效率都会提高很多:
In[235]:= cf = Compile[{{dat, _Real, 3}},
Module[{n = Length[dat], l},
Table[
l = dat[[i, 1 ;; i]];
Total@Sqrt[Total /@ (# - Mean[l] & /@ l)^2], {i, n - 1}]
]
];
ans3 = cf[dat]; // AbsoluteTiming
ans1 == ans2 == ans3
Out[236]= {0.0761915, Null}
Out[237]= True
2019年09月24日 16点09分 3
哇,谢谢东瓜哥。我是看的https://tieba.baidu.com/p/4246953053,先用Compile`CompilerFunctions[] // Sort查了一下,没有发现Total,Mean,就觉得他俩好像不能编译。[疑问]
2019年09月25日 12点09分
@jiaoeyushushu 我紧接着也写了“……就可以知道其中的大部分了。(特例当然是有几个的,不过本帖并不是来讨论特例的所以略过,更多内容大家可以阅读这帖。)”
2019年10月05日 05点10分
1