Matlab核心部分代码如下(可简化的不多了,索性都贴上了,核心是fmincon函数,需要读取grain_spot_list.txt文件https://1drv.ms/t/s!Alc9TKg71lAsmYACBjhpi6TyQe8tOQ?e=vJa4mx
直接运行test函数即可。由于类似操作要做几万遍,用Matlab实在太耗时,希望能用Julia实现并提高效率,奈何水平有限,特来此求助,多谢
function [refined_ori, refined_pos, refined_error] = test
spot_list = importdata('grain_spot_list.txt');
B = [2.191936266240916 0 0
0 2.191936266240916 0
0 0 2.191936266240916];
x0 = [0.717821405534626
0.692917298758609
0.067808899396516
-0.447251137765496
0.533571784789791
-0.717821405534626
-0.533571784789791
0.484939962837988
0.692917298758609
0
0
0]';
ConstraintFunction = @constraintfun;
options = optimoptions('fmincon','Display','off');
LB = [-1 -1 -1 -1 -1 -1 -1 -1 -1 -0.5 -0.5 -0.5];
UB = [ 1 1 1 1 1 1 1 1 1 0.5 0.5 0.5];
[refined_grain,fval,~,~] = ...
fmincon(@(x) fitgrains(x,spot_list,B),x0,...
[],[],[],[],LB,UB,ConstraintFunction,options);
refined_ori = reshape(refined_grain(1:9),3,3);
refined_pos = refined_grain(10:12);
refined_error = fval;
end
function angle_sum = fitgrains(x,spot_list,B)
U = reshape(x(1:9),3,3);
pos = x(10:12);
refined_Gvs = zeros(size(spot_list,1),3);
Gv_angle = zeros(size(spot_list,1),1);
for i = 1:size(spot_list,1)
rot = spot_list(i,2);
phi1 = rot*pi/180;
PHI = 0;
phi2 = 0;
U11 = cos(phi1)*cos(phi2)-sin(phi1)*sin(phi2)*cos(PHI);
U21 = sin(phi1)*cos(phi2)+cos(phi1)*sin(phi2)*cos(PHI);
U31 = sin(phi2)*sin(PHI);
U12 = -cos(phi1)*sin(phi2)-sin(phi1)*cos(phi2)*cos(PHI);
U22 = -sin(phi1)*sin(phi2)+cos(phi1)*cos(phi2)*cos(PHI);
U32 = cos(phi2)*sin(PHI);
U13 = sin(phi1)*sin(PHI);
U23 = -cos(phi1)*sin(PHI);
U33 = cos(PHI);
Omega = [U11 U12 U13; U21 U22 U23; U31 U32 U33];
spotsWeightedCentroid = spot_list(i,6:7);
pos_rot = Omega*pos';
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dety0 = 512.4836;
detz0 = 512.0230;
pixelysize = 0.067176;
pixelzsize = 0.067176;
Rtilt = eye(3);
Lsam2sou = [-100 0 0];
Lsam2det = 100;
K_in = [pos_rot(1) pos_rot(2) pos_rot(3)] - Lsam2sou;
dety = spotsWeightedCentroid(1);
detz = spotsWeightedCentroid(2);
spot_pos = Rtilt*[Lsam2det (dety-dety0)*pixelysize (detz-detz0)*pixelzsize]';
K_out = spot_pos - pos_rot;
refined_Gvs(i,:) = normr(normr(K_out')-normr(K_in));
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Gv_angle(i) = acos(dot(normr(Omega*U*B*spot_list(i,8:10)'),normr(refined_Gvs(i,:))));
end
angle_sum = sum(abs(Gv_angle));
end
function [c, ceq]= constraintfun(x)
c = [];
U = reshape(x(1:9),3,3);
ceq = U*U'-eye(3);
end