作者candy88257 (阿泰斯)
看板MATLAB
标题Re: [讨论] 改写成parfor完成,但某些间隔会跑出错误!
时间Thu Apr 25 09:24:39 2013
※ 引述《candy88257 (阿泰斯)》之铭言:
: 例如:
: function connect=Qdata(v1,v2,v3)
: syms a
: data=[];
: steps=((v2-v1)/v3)+1;
: hwait=waitbar(0,'wait');
: for vv=v1:v3:v2
: str=['计算vv中,共',num2str((((v2-v1)/v3)+1)),'个vv,','第
: ',num2str((((vv-v1)/v3)+1)),'个vv'];
: waitbar((((vv-v1)/v3)+1)/steps,hwait,str);
: mm=[a,vv,3+a;a+vv,2+a,1+a;a,2*a,a+2*vv];
: eq=det(mm);
: eqans=solve(eq,'a');
: data=[data,eqans];
: end
: close(hwait);
: connect=data;
: end
: 上面那段要怎改写成parfor并行运算?
: 求高手帮助!
: 感谢!
先不管data的顺序,目前想先把parfor弄好
我自己改写成这样:
function connect=Qdata(v1,v2,v3) %v1最小值; v2 max; v3 间隔
matlabpool local 8
a=sym('a');
data=[];
vall=fix(((v2-v1)/v3)+1);
%会加个fix是因为常常有1.00这种东西出现,而程式就会跑出错误
parfor ii=1:vall
vv=v1+v3*(ii-1)
mm=[a,vv,3+a;a+vv,2+a,1+a;a,2*a,a+2*vv];
%真实的矩阵不方便放上来,但其他地方写法应该依样
eq=det(mm);
eqans=solve(eq,'a');
data=[data,eqans];
end
connect=data;
matlabpool close
end
首先,我测试过确定原版的for的写法可以跑任何间隔(v3)以及任何v1~v2的范围
但改成parfor後,发现v3=1 or 0.1都可以跑,但v3=0.01的时候(如:Qdata(0,5,0.01))
会跑出错误,而且是算到一半才出现错误(大约50%)
错误如下:
Error using parallel_function (line 589)
Error in MuPAD command: Invalid argument. [stdlib::from64]
Evaluating: symobj::fromString
Error in Qdata (line 8)
parfor ii=1:vall
字面上的意思是无效的参数
但是实在看不出来哪里有无效的参数...
恳求高手帮助!!
感谢!!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.130.17.157
1F:→ candy88257:iHakka大大您太厉害了,我把data那几行删掉就没出现那 04/25 10:41
2F:→ candy88257:个错误了! 04/25 10:41
3F:→ candy88257:但在parfor里面要怎麽把资料存进data?? 04/25 10:41
4F:推 iHakka:help parfor 04/25 15:33
5F:→ candy88257:老实讲我问问题之前都会做到头脑快爆炸了才出来问... 04/25 16:10
6F:→ candy88257:我是真的不知道help parfor里面哪里有写有关按顺序存 04/25 16:11
7F:→ candy88257:资料的教学... 04/25 16:11
8F:→ iHakka:他有范例写他怎麽存资料我不认为很难看懂 04/25 16:55
9F:→ iHakka:想想怎麽用利用idx 04/25 16:57
10F:→ candy88257:好的,我会正仔细看help。但是,想问一下 04/25 17:42
11F:→ candy88257:把data=[data,eqans]那行改成for jj=1:3 04/25 17:44
12F:→ candy88257:data=[data;[eqans(jj),vv]] 04/25 17:45
13F:→ candy88257:end 这样好像解出来会自动帮我们按照vv排列 04/25 17:45
14F:→ candy88257:但怎麽也是在间隔0.01在运算的时候会出错? 逻辑有错? 04/25 17:46