24小时热门版块排行榜    

CyRhmU.jpeg
南方科技大学公共卫生及应急管理学院2025级博士研究生招生报考通知
查看: 3531  |  回复: 10
当前只显示满足指定条件的回帖,点击这里查看本话题的所有回帖

Gout

金虫 (正式写手)

[求助] 如何将取向矩阵中归一化的{hkl}转化成互质化的{HKL},求算法!!!!

如何将取向矩阵中归一化的{hkl}转化成互质化的整数{HKL},求程序算法!!!!
      
        具体就是将如何将三个小数化为互质化的整数??
回复此楼

» 收录本帖的淘帖专辑推荐

科研、投稿中可能遇到的小问题

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

仰望着那片蓝天
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

zxhao168

捐助贵宾 (正式写手)


【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
感谢参与,应助指数 +1
zhyq8767: 金币+3, 感谢应助 2012-04-04 22:05:10
Gout: 金币+10, ★★★★★最佳答案, 绝对的好人,非常好的程序,谢谢你啊~ 2012-04-05 09:10:41
Gout: 回帖置顶 2012-04-05 09:27:32
clear
clc
Indices=input('Please input the normalized indices [hkl]=');
h=Indices(1,1)/sqrt(dot(Indices,Indices));
k=Indices(1,2)/sqrt(dot(Indices,Indices));
l=Indices(1,3)/sqrt(dot(Indices,Indices));
h1=abs(h);
k1=abs(k);
l1=abs(l);
if h1>1e-3 && k1>1e-3 && l1>1e-3    % [hkl]均非负
    if h1>=l1 && k1>=l1     % l1最小
        A=h1/l1;
        B=k1/l1;
        i=1;
        while (abs(A-round(A))>1e-2 || abs(B-round(B))>1e-2)
            A=A*(i+1)/i;
            B=B*(i+1)/i;
            i=i+1;
        end
        if sign(l)<0
            L=-i;
        else
            L=i;
        end
        if sign(h)<0
            H=-round(A);
        else
            H=round(A);
        end
        if sign(k)<0
            K=-round(B);
        else
            K=round(B);
        end
    elseif h1>=k1 && l1>=k1    % k1最小
        A=h1/k1;
        B=l1/k1;
        i=1;
        while (abs(A-round(A))>1e-2 || abs(B-round(B))>1e-2)
            A=A*(i+1)/i;
            B=B*(i+1)/i;
            i=i+1;
        end
        if sign(k)<0
            K=-i;
        else
            K=i;
        end
        if sign(h)<0
            H=-round(A);
        else
            H=round(A);
        end
        if sign(l)<0
            L=-round(B);
        else
            L=round(B);
        end
    elseif k1>=h1 && l1>=h1     % h1最小
        A=k1/h1;
        B=l1/h1;
        i=1;
        while (abs(A-round(A))>1e-2 || abs(B-round(B))>1e-2)
            A=A*(i+1)/i;
            B=B*(i+1)/i;
            i=i+1;
        end
        if sign(h)<0
            H=-i;
        else
            H=i;
        end
        if sign(k)<0
            K=-round(A);
        else
            K=round(A);
        end
        if sign(l)<0
            L=-round(B);
        else
            L=round(B);
        end
    end
elseif h1<=1e-3            % h1 接近零
    H=0;
    if k1<=1e-3        % h1接近零的同时k1也接近零
        K=0;
        if sign(l)<0
            L=-round(l);
        else
            L=round(l);
        end
    elseif l1<=1e-3    % h1接近零的同时,l1也接近零
        L=0;
        if sign(k)<0
            K=-round(k);
        else
            K=round(k);
        end
    elseif k1>1e-3 && l1>1e-3     % 只有h1 接近零
        if k1>l1
            A=k1/l1;
            i=1;
            while(abs(A-round(A))>1e-3)
                A=A*(i+1)/i;
                i=i+1;
            end
            if sign(l)<0
                L=-i;
            else
                L=i;
            end
            if sign(k)<0
                K=-round(A);
            else
                K=round(A);
            end
        else
            A=l1/k1;
            i=1;
            while(abs(A-round(A))>1e-3)
                A=A*(i+1)/i;
                i=i+1;
            end
            if sign(k)<0
                K=-i;
            else
                K=i;
            end
            if sign(l)<0
                L=-round(A);
            else
                L=round(A);
            end
        end
    end
elseif k1<=1e-3            % k1 接近零
    K=0;
    if h1<=1e-3        % k1接近零的同时h1也接近零
        H=0;
        if sign(l)<0
            L=-round(l);
        else
            L=round(l);
        end
    elseif l1<=1e-3    % k1接近零的同时,l1也接近零
        L=0;
        if sign(h)<0
            H=-round(h);
        else
            H=round(h);
        end
    elseif h1>1e-3 && l1>1e-3     % 只有k1 接近零
        if h1>l1
            A=h1/l1;
            i=1;
            while(abs(A-round(A))>1e-3)
                A=A*(i+1)/i;
                i=i+1;
            end
            if sign(l)<0
                L=-i;
            else
                L=i;
            end
            if sign(h)<0
                H=-round(A);
            else
                H=round(A);
            end
        else
            A=l1/k1;
            i=1;
            while(abs(A-round(A))>1e-3)
                A=A*(i+1)/i;
                i=i+1;
            end
            if sign(h)<0
                H=-i;
            else
                H=i;
            end
            if sign(l)<0
                L=-round(A);
            else
                L=round(A);
            end
        end
    end
elseif l1<=1e-3            % l1 接近零
    L=0;
    if h1<=1e-3        % l1接近零的同时h1也接近零
        H=0;
        if sign(k)<0
            K=-round(k);
        else
            K=round(k);
        end
    elseif k1<=1e-3    % l1接近零的同时,k1也接近零
        K=0;
        if sign(h)<0
            H=-round(h);
        else
            H=round(h);
        end
    elseif h1>1e-3 && k1>1e-3     % 只有l1 接近零
        if h1>k1
            A=h1/k1;
            i=1;
            while(abs(A-round(A))>1e-3)
                A=A*(i+1)/i;
                i=i+1;
            end
            if sign(k)<0
                K=-i;
            else
                K=i;
            end
            if sign(h)<0
                H=-round(A);
            else
                H=round(A);
            end
        else
            A=k1/h1;
            i=1;
            while(abs(A-round(A))>1e-3)
                A=A*(i+1)/i;
                i=i+1;
            end
            if sign(h)<0
                H=-i;
            else
                H=i;
            end
            if sign(k)<0
                K=-round(A);
            else
                K=round(A);
            end
        end
    end
end
disp('互质化后的指数[HKL]=')
disp([H K L])

» 本帖已获得的红花(最新10朵)

6楼2012-04-04 22:02:47
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
查看全部 11 个回答

hljhrb_ccl

金虫 (著名写手)


感谢参与,应助指数 +1
毛猴: 金币+1, 感谢交流! 2012-04-02 09:34:37
毛猴: 应助指数-1, 感谢交流! 2012-04-02 09:34:48
具体算法我不知道,使用textools这个软件有一个功能就是可以进行这样的转化的。我之前对镁合金的织构组分分析的时候,就利用这个软件!
让知识转化为能力!
2楼2012-04-02 07:51:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

huangbx3

铁杆木虫 (小有名气)

【答案】应助回帖


感谢参与,应助指数 +1
毛猴: 金币+1, 感谢交流! 2012-04-02 09:34:56
个人感觉该问题应该这样解决:
先将三个小数整数化,即同乘以一个数后将三个小数都变为整数;
然后将整数化的三个数同除以公约数,即可得到三个互质的数。
Lovethepeopleyoumet
3楼2012-04-02 09:34:13
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Gout

金虫 (正式写手)

引用回帖:
2楼: Originally posted by hljhrb_ccl at 2012-04-02 07:51:35:
具体算法我不知道,使用textools这个软件有一个功能就是可以进行这样的转化的。我之前对镁合金的织构组分分析的时候,就利用这个软件!

嗯 我看到杨平老师在他的那本书中介绍这个软件时,提到textools这个软件有这个功能。可是,我现在授权使用的软件只有channel 5 和labtex,而且我更想添加到一些小程序里面,看来还得好好想想。
仰望着那片蓝天
4楼2012-04-02 10:12:02
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
信息提示
请填处理意见