weixin_44179497 2020-05-01 22:43 采纳率: 7.7%
浏览 139
已采纳

【matlab】求帮这份代码每句话加个注释

clear;
clc;
close all;

a=150;
b=600;
m=1000;
numbers=0;
x=-600:20:600;
y=-600:20:600;
z=200:20:1200;

for i=1:length(z)
W=zeros(length(x),length(y));

for j=1:length(x)
for k=1:length(y)

d3=sqrt((x(j))^2+(y(k))^2+(z(i))^2);
theta2=acos(-(x(j))/d3);
theta1=acos((y(k))/d3/sin(theta2));

a10=a.*[1;0;0];
a20=a.*[-1/2;cos(pi/6);0];
a30=a.*[-1/2;-cos(pi/6);0];

b1=b.*[1;0;0];
b2=b.*[-1/2;cos(pi/6);0];
b3=b.*[-1/2;-cos(pi/6);0];

R=[sin(theta2),0,-cos(theta2);
cos(theta1)*cos(theta2),sin(theta1),cos(theta1)*sin(theta2);
sin(theta1)*cos(theta2),-cos(theta1),sin(theta1)*sin(theta2)];
a1=R*a10;
a2=R*a20;
a3=R*a30;

r=[x(j);y(k);z(i)];

q1=(norm(a1+r-b1));
q2=(norm(a2+r-b2));
q3=(norm(a3+r-b3));

Q1=(a1+r-b1)./(norm(a1+r-b1));
Q2=(a2+r-b2)./(norm(a2+r-b2));
Q3=(a3+r-b3)./(norm(a3+r-b3));
Q11=[0,0,1];
gamma1=acos(Q11*Q1);
gamma2=acos(Q11*Q2);
gamma3=acos(Q11*Q3);

flag_d3=(400<d3)&(d3<1000);
flag_theta1=(pi/3<theta1)&(theta1<2*pi/3);
flag_theta2=(pi/3<theta2)&(theta2<2*pi/3);
flag_q1=(600<q1)&(q1<1080);
flag_q2=(600<q2)&(q2<1080);
flag_q3=(600<q3)&(q3<1080);
flag_gamma1=(0<gamma1)&(gamma1<pi/4);
flag_gamma2=(0<gamma2)&(gamma2<pi/4);
flag_gamma3=(0<gamma3)&(gamma3<pi/4);

if (flag_d3*flag_theta1*flag_theta2*flag_q1*flag_q2*flag_q3*flag_gamma1*flag_gamma2*flag_gamma3)==1
W(k,j)=z(i);
numbers=numbers+1;
else W(k,j)=NaN;
end

end
end
surf(x,y,W);
hold on
end

shading interp;
colormap jet;
xlabel('x/(mm)');
ylabel('y/(mm)');
zlabel('z/(mm)')


  • 写回答

1条回答 默认 最新

  • P Jay 2020-05-02 19:30
    关注

    建议自行用matlab的help函数自行查找一下命令的含义和函数的功能

    clear; %清除当前工作区的变量
    clc; %清空命令行窗口的内容
    close all; %关闭所有打开的figure
    
    a=150; %a变量赋值为150
    b=600; %b变量赋值为600
    m=1000; %m变量赋值为1000
    numbers=0; %numbers变量赋值为0
    x=-600:20:600; %创建一个从-600开始到600结束,步长为20的数组
    y=-600:20:600; %创建一个从-600开始到600结束,步长为20的数组
    z=200:20:1200; %创建一个从200开始到1200结束,步长为20的数组
    
    for i=1:length(z) %for循环,循环计数变量i从1开始,到数组z的长度大小,即循环数组z的长度这么多次
        W=zeros(length(x),length(y)); %创建行数为数组x的长度,列数为数组y的长度的二维数组,所有元素都是0
    
        for j=1:length(x) %循环
            for k=1:length(y) %循环
                %注意!!!matlab里面的数组第一个元素的索引是1,而不是像其他编程语言那样的0
                d3=sqrt((x(j))^2+(y(k))^2+(z(i))^2); %x数组的第j个元素,y数组的第k个元素,z数组的第i个元素的平方和开根号
                theta2=acos(-(x(j))/d3); %括号内是x数组的第j个元素除以d3变量再取负的值,然后反余弦arccos()这个括号内的值
                theta1=acos((y(k))/d3/sin(theta2)); %sin()正弦函数
    
                a10=a.*[1;0;0]; %因为a为标量,[1;0;0]为向量,维度不同,所以添加.,代表a与向量中的每个元素运算
                a20=a.*[-1/2;cos(pi/6);0]; %pi就是圆周率
                a30=a.*[-1/2;-cos(pi/6);0];
    
                b1=b.*[1;0;0]; %[1;0;0]  ;代表下一行,所以这是个3行1列的列向量
                b2=b.*[-1/2;cos(pi/6);0];
                b3=b.*[-1/2;-cos(pi/6);0];
    
                R=[sin(theta2),0,-cos(theta2);
                cos(theta1)*cos(theta2),sin(theta1),cos(theta1)*sin(theta2);
                sin(theta1)*cos(theta2),-cos(theta1),sin(theta1)*sin(theta2)]; %  ,代表下一个元素,这是一个3行3列的二维数组
                a1=R*a10; %数组乘法,只需R列数等于a10行数即可
                a2=R*a20;
                a3=R*a30;
    
                r=[x(j);y(k);z(i)];
    
                q1=(norm(a1+r-b1)); %norm(v)返回向量v的2-范数或欧几里德范数
                q2=(norm(a2+r-b2));
                q3=(norm(a3+r-b3));
    
                Q1=(a1+r-b1)./(norm(a1+r-b1)); 
                Q2=(a2+r-b2)./(norm(a2+r-b2));
                Q3=(a3+r-b3)./(norm(a3+r-b3));
                Q11=[0,0,1];
                gamma1=acos(Q11*Q1);
                gamma2=acos(Q11*Q2);
                gamma3=acos(Q11*Q3);
    
                flag_d3=(400<d3)&(d3<1000); %两个不等式的逻辑值相与之后的逻辑值
                flag_theta1=(pi/3<theta1)&(theta1<2*pi/3); %不等式成立则为1,1与1为1,1与0为0,0与1为0,0与0为0
                flag_theta2=(pi/3<theta2)&(theta2<2*pi/3);
                flag_q1=(600<q1)&(q1<1080);
                flag_q2=(600<q2)&(q2<1080);
                flag_q3=(600<q3)&(q3<1080);
                flag_gamma1=(0<gamma1)&(gamma1<pi/4);
                flag_gamma2=(0<gamma2)&(gamma2<pi/4);
                flag_gamma3=(0<gamma3)&(gamma3<pi/4);
    
                if (flag_d3*flag_theta1*flag_theta2*flag_q1*flag_q2*flag_q3*flag_gamma1*flag_gamma2*flag_gamma3)==1 %条件判断,如果所有flag都是1则执行
                    W(k,j)=z(i); %W的第k行第j列的元素等于z的第i个元素
                    numbers=numbers+1; %numbers自增
                else W(k,j)=NaN; %否则W的第k行第j列的元素等于z的第i个元素
                end %对应缩进位置的if结束
    
            end %最近缩进位置的for结束
        end %最近缩进位置的for结束
        surf(x,y,W); %生成曲面图,xyW对应坐标的xyz
        hold on %保持当前的坐标区,继续绘图
    end %最近缩进位置的for结束
    
    shading interp; %通过在每个线条或面中对颜色图索引或真彩色值进行插值来改变该线条或面中的颜色
                    %shading - 设置颜色阴影属性
    colormap jet; %设置当前颜色图,jet对应的色阶图如下图所示
    xlabel('x/(mm)'); %x坐标轴的标志
    ylabel('y/(mm)'); %y坐标轴的标志
    zlabel('z/(mm)') %z坐标轴的标志
    

    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 帮我写一个c++工程
  • ¥30 Eclipse官网打不开,官网首页进不去,显示无法访问此页面,求解决方法
  • ¥15 关于smbclient 库的使用
  • ¥15 微信小程序协议怎么写
  • ¥15 c语言怎么用printf(“\b \b”)与getch()实现黑框里写入与删除?
  • ¥20 怎么用dlib库的算法识别小麦病虫害
  • ¥15 华为ensp模拟器中S5700交换机在配置过程中老是反复重启
  • ¥15 java写代码遇到问题,求帮助
  • ¥15 uniapp uview http 如何实现统一的请求异常信息提示?
  • ¥15 有了解d3和topogram.js库的吗?有偿请教