CyRhmU.jpeg
南方科技大学公共卫生及应急管理学院2026级博士研究生招生报考通知(长期有效)
查看: 3524  |  回复: 10

Gout

金虫 (正式写手)

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

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

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

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

» 猜你喜欢

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

仰望着那片蓝天
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
回帖置顶 ( 共有1个 )

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的回帖
普通回帖

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的回帖

Gout

金虫 (正式写手)

引用回帖:
3楼: Originally posted by huangbx3 at 2012-04-02 09:34:13:
个人感觉该问题应该这样解决:
先将三个小数整数化,即同乘以一个数后将三个小数都变为整数;
然后将整数化的三个数同除以公约数,即可得到三个互质的数。

我也曾这样想过,但是有一个问题。得到的取向矩阵每个元素都是小数点后面好多位的小数,所以取整数再除以公约数会有很大的困难,而且计算得可能是得到,例如1000001:2000001:3000001这种答案等等。
仰望着那片蓝天
5楼2012-04-02 10:19:21
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

Gout

金虫 (正式写手)

送鲜花一朵
引用回帖:
6楼: Originally posted by zxhao168 at 2012-04-04 22:02:47:
clear
clc
Indices=input('Please input the normalized indices =');
h=Indices(1,1)/sqrt(dot(Indices,Indices));
k=Indices(1,2)/sqrt(dot(Indices,Indices));
l=Indices(1,3)/sqrt(dot(Indices,Indices) ...

很棒的程序,非常感谢!!!
仰望着那片蓝天
7楼2012-04-05 09:14:19
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

梦中人sss

铁虫 (小有名气)

引用回帖:
7楼: Originally posted by Gout at 2012-04-05 09:14:19
很棒的程序,非常感谢!!!...

哥们,你好,请问下这个程序如何执行吗,是以矩阵形式输入一个行向量吗,如输入【1,0,0】这种吗,感觉运行会出错,不是这么输入的
Hello,ladiesandgentleman
8楼2014-09-05 23:17:33
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

jeffchenhust

铜虫 (小有名气)

Textools有试用版的。http://www.sciencesoftware.com.c ... detail12.asp?id=688
在右侧那边可以下载试用版
9楼2015-01-25 13:20:34
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

lwp8989

新虫 (初入文坛)

引用回帖:
9楼: Originally posted by jeffchenhust at 2015-01-25 13:20:34
Textools有试用版的。http://www.sciencesoftware.com.cn/share/search_soft_detail12.asp?id=688
在右侧那边可以下载试用版

Textools这个软件还能找到吗?我也需要用!感谢!
10楼2018-05-29 10:39:30
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 Gout 的主题更新
信息提示
请填处理意见