精华内容
下载资源
问答
  • 生成旋转矩阵

    2015-09-10 20:06:44
    旋转矩阵是用Euler角描述的,采用三个角度值形成矩阵。
  • 旋转矩阵的数学原理

    2017-09-06 11:41:00
    旋转矩阵的数学原理 一、从寇克曼女生问题讲起 旋转矩阵涉及到的是一种组合设计:覆盖设计。而覆盖设计,填装设计,斯坦纳系,t-设计都是离散数学中组合优化问题。它们解决的是如何组合集合中的元素以达到某种...

    旋转矩阵的数学原理

    一、从寇克曼女生问题讲起

    旋转矩阵涉及到的是一种组合设计:覆盖设计。而覆盖设计,填装设计,斯坦纳系,t-设计都是离散数学中组合优化问题。它们解决的是如何组合集合中的元素以达到某种特定的要求。

    为了使读者更容易明白这些问题,下面先从一道相当古老的数学名题讲起。

    (一)寇克曼女生问题

    某教员打算这样安排她班上的十五名女生散步:散步时三名女生为一组,共五组。问能否在一周内每日安排一次散步,使得每两名女生在这周内一道散步恰好一次?

    看起来题目似乎很简单,然而它的彻底解决并不容易。事实上,寇克曼于1847年提出了该问题,过了100多年后,对于一般形式的寇克曼问题的存在性才彻底解决。

    用1-15这15个数字分别代表这15个女生,下面给出一组符合要求的分组方法:

    星期日:(1,2,3),(4,8,12),(5,10,15),(6,11,13),(7,9,14)

    星期一:(1,4,5),(2,8,10),(3,13,14),(6,9,15),(7,11,12)

    星期二:(1,6,7),(2,9,11),(3,12,15),(4,10,14),(5,8,13)

    星期三:(1,8,9),(2,12,14),(3,5,6),(4,11,15),(7,10,13)

    星期四:(1,10,11),(2,13,15),(3,4,7),(5,9,12),(6,8,14)

    星期五:(1,12,13),(2,4,6),(3,9,10),(5,11,14),(7,8,15)

    星期六:(1,14,15),(2,5,7),(3,8,11),(4,9,13),(6,10,12)

    该问题就是最典型的组合设计问题。其本质就是如何将一个集合中的元素组合成一定的子集系以满足一定的要求。表面上看起来,寇克曼女生问题是纯粹的数学游戏,然而它的解却在医药试验设计上有很广泛的运用。

    寇克曼女生问题是t-设计中很特殊的一类——可分解斯坦纳设计。下面我会详细解释这几个名词的含义。

    (二)几种组合设计的含义

    所谓t-设计是“策略组态,Tactical Configuration”的简称。

    不妨用数学语言来定义t-设计

    S={S1,S2,...,Sv}S={S1,S2,...,Sv}是一个包含有vv个元素的集合;

    B1,B2,...,BbB1,B2,...,BbSSbb个子集,而它们包含的元素个数和都是kk个;

    B={B1,B2,...,Bb}B={B1,B2,...,Bb}是由这bb个子集组成的集合(子集系),

    对于固定整数t,和S的任意一个t元子集(t≥1),如果包含该子集的BB中子集的个数都是同一个常数λtλt,则称B={B1,B2,...,Bb}B={B1,B2,...,Bb}是集合SS上的一个t(v,k,λt)t−(v,k,λt)设计,简称t-设计

    如果t(v,k,λt)t−(v,k,λt)设计中,t=2,λ=1t=2,λ=1,则称为斯坦纳系(Steiner)。在该领域,我国已故的数学家陆家羲作出的巨大的贡献,如今每一本讲组合设计的书讲到这个问题,就不能不提到他的大名和以他的名字命名的定理。至今为止,斯坦纳系仍然存在着许多未解决的问题,至今还没有解决(17,5,4=476)(17,5,4=476)S(18,6,5=1428)S(18,6,5=1428)的存在或不存在。虽然它的参数显得很小。

    而旋转矩阵涉及的则是另一种更加复杂、参数更多的组合设计——覆盖设计。

    覆盖设计是一种经过精心设计的b个区组组成的子集系,其中每个区组都有kk个元素组成。它可以确保如果选出kk个元素,有mm个在其中,至少有λλ个区组中的元素有tt个元素符合。区组中元素的顺序与区组的排列顺序不影响覆盖设计本身。

    (c:v,k,t,m,λ=b)(c:v,k,t,m,λ=b)

    可以用数学语言来定义比较简单的覆盖设计:

    S={S1,S2,...,Sv}S={S1,S2,...,Sv}是一个包含有vv个元素的集合;

    B1,B2,...,BbB1,B2,...,BbSSbb个子集,而它们包含的元素个数都是kk个;

    B={B1,B2,...,Bb}B={B1,B2,...,Bb}是由这bb个子集组成的集合(子集系)。

    对于固定整数tt,和SS的任意一个tt元子集(t1t≥1),如果该子集至少包含在BBλλ个区组中,则称B={B1,B2,...,Bb}B={B1,B2,...,Bb}是集合SS上的一个c(v,k,λt)c−(v,k,λt)设计,简称覆盖设计。

    填装设计是与覆盖设计相反的设计:

    S={S1,S2,...,Sv}S={S1,S2,...,Sv}是一个包含有vv个元素的集合;

    B1,B2,...,BbB1,B2,...,BbSSbb个子集,而它们包含的元素个数都是kk个;

    B={B1,B2,...,Bb}B={B1,B2,...,Bb}是由这bb个子集组成的集合(子集系)。

    对于固定整数tt,和S的任意一个tt元子集(t1t≥1),如果该子集至多包含在BBλλ个区组中,则称B={B1,B2,...,Bb}B={B1,B2,...,Bb}是集合SS上的一个p(v,k,λt)p−(v,k,λt)设计,简称填装设计。

    t-设计又叫恰好覆盖与恰好填装。t-设计不一定存在,而覆盖设计一定存在。t-设计中,λ=1λ=1,而覆盖设计一般λ>1λ>1。此外,t-设计m=tm=t,所以t-设计只是覆盖设计中比较特殊的一种。

    只要bb足够大,显然覆盖设计一定存在。而有意义的是找到bb的最小值,并找出在上最小值下的覆盖设计,此时的覆盖设计叫做最小覆盖。寻找最小覆盖的问题是组合优化问题的一类,被称为集合覆盖问题(SCP,Set covering problem),与著名的推销员旅行问题或成本最小化、利润最大化问题,都是优化问题的一种。

    但是集合覆盖问题往往经这些问题更加困难。因为其它问题往往已经有比较成熟的、固定的方法。而覆盖设计并没有通用的公式,所以大部分的设计即使用如克雷般超级电脑也很难求出,全盘搜索的算法耗用时间将会是一个天文数字。

    这方面,算法就显得相当重要。Oester Grad教授创造出一种全新的模拟算法,它大大提高了求解覆盖设计的速度,但它不能保证找到的覆盖设计一定是最小覆盖设计。它具有很强的通用性。而之前的其他算法往往只能解决固定某些参数的特定问题,解决的往往只是一类问题。

    对覆盖设计的研究始于19世纪,1835年J·Plue Cker和W.S.B.Wool House(1844)开始研究此类问题。

    到了1969年,人们发现它对军队中布阵与战略设计以及计算机芯片设计都大有用途,因此得到了迅速发展。在统计上,医药设计,农业试验,核研究,质量控制甚至在彩票中都大有用途。

    组合设计问题往往来自于智力游戏,对它们的研究也是纯数学的。但是当研究逐渐深入时,人们逐渐地在生产与其他学科中发现了它的用武之地。这样对它的研究就有了更强大的动力,吸引了更多人的注意,成果也就更加丰富。

    在选7的彩票涉及的旋转矩阵中,所有的(6,六)型和(5,五)型旋转矩阵都是t-设计。而一般的旋转矩阵都是覆盖设计。由于数学上对t-设计研究的比较多,所以有时候我们可以利用t-设计生成一些覆盖设计。

    如以下的设计即为一个t(10,3,3)t−(10,3,3)设计,它在有限射影几何中有很广泛的运用。

    B:(2,3,4),(1,5,10),(1,6,9)

    (1,7,8),(2,9,10),(3,8,10)

    (4,8,9),(4,6,7),(3,5,7),(2,5,6)

    即1-10每个数字都出现了3次,而且每两个数字恰好一起出现1次。从它可以生成10注10个号(7,六)型矩阵(它相当对称,平衡但不是最优的),具体生成方法很简单,取每一组的剩余的7个数就可以生成对应的一组。

    (三)组合设计的研究内容

    1.存在性问题

    若给出要求,研究符合要求的组合设计是否存在,以及存在的条件问题。比如,彩票中的覆盖设计问题,它的存在性就不是问题,因为只要注数足够多,总是可以覆盖的(它的上限为复式投注即完全组合,有意义的是它的下限)。而t-设计又叫恰好覆盖,它的存在性就是一个很值得研究的问题,也就是说,参数要符合什么条件,才会存在恰好覆盖一次的设计。

    对存在性的研究更多的是从理论上。然而,对于一般情形的t-设计是否存在的问题,还远远没有解决。

    2.构造问题

    如果已知某种组合设计存在时,如何把它们构造出来?这是与实际应用联系最紧的问题。实际上,最终无论在彩票中,还是新药设计中,人们关心的是构造出的组合设计。经过数学家上百年的努力,现在已经有一些构造方法。如利用有限的射影几何,关联矩阵,数论中的差集等构造出大量的设计。用组合论自身也能解决一些构造问题。然而,对于一般情形的组合设计的构造性问题离解决还相当遥远。比如彩票中覆盖设计问题(即旋转矩阵)当参数变大时,设计的难度是几何级数上升。

    对于一般的最小覆盖问题,仍然没有通用的构造方法。也就是说,目前市场上出现的许许多号码比较多的旋转矩阵,都很难保证是最小覆盖设计,也就是无法保证它是最优的。很多旋转矩阵不断地有人刷新它的下限纪录,也就是越来越接近最小覆盖设计。然而,要证明一个旋转矩阵是否已经是最小覆盖设计,是极其困难的,如果号码很少,还可以通过计算机编程用穷举的方式来解决,而号码稍微多一点,用穷举法超级电脑运算所耗用的时间也将是天文数字。

    3.组合设计之间的关系

    例如:一个组合设计是否与另外一个组合设计本质上一样的(同构)。比如把组合中某两个数字互换,这两个设计应该算同一种设计。每一种设计的同构设计是非常多的。有些同构是很难直接看出的,所以就需要研究同构的设计有什么特点,如何准确快速的判断和产生同构设计。

    组合设计还研究如何由一个组合设计构造出另外一个。

    比如旋转矩阵中存在着这样的问题,比如10个号码01-10,开始我先选定3注:

    01,02,03,04,05,06,07,

    01,03,05,07,08,09,10,

    02,04,06,07,08,09,10

    问如何添上尽可能少的注数,使它成为(7,六)型平衡式矩阵。

    又如一个旋转矩阵与另外一个旋转矩阵是否同构。即使两个旋转矩阵所有参数都相同,也不一定同构。然而,在实际运用中,人们并不关心同构问题。因为只要能用就行了。

    又如10个号码(7,六)型的有8注,比如是01-10这10个号码,问能否在这基础上添上尽可能少的注数,使得它成为11个号码的(7,六)型的旋转矩阵(01-11)。

    4.计数问题

    如果已知某类组合设计存在,自然希望知道这类设计的个数。也就是说互不同构的设计的个数。然而,这个问题是一个极其艰难的问题,现在还很少人去研究它。

    比如很简单的10个号码的(7,六)型矩阵,共有多少种。号码一多,这将是一个很困难的问题。

    5.最优设计

    在诸多的满足要求的组合设计中,找到一个最优的设计,这是它研究的内容。比如覆盖设计很多,如何找出最小覆盖设计就是一具艰难的问题。旋转矩阵中需要用到组合优化的算法与组合构造算法。

    二、旋转矩阵的主要算法

    (一)对旋转矩阵做出突出贡献的主要数学家

    旋转矩阵是一个看似简单实际却异常复杂的问题,尽管有许许多多的人对它非常感兴趣,然而真正在这个领域内做出了开创性贡献的人却不是很多。要想在此领域有所作为,不仅要对组合设计的经典理论和常用方法有深入的了解,还要在此基础上有所创新。有许多国外的彩票专家,比如美国的盖尔·霍华德女士,声称旋转矩阵是由她首先提出来的。实际上,所有的旋转矩阵都是组合数学家们经过多年的精心研究得出的,而不是霍华德这样的彩票专家所能研究出来的。

    在此领域内做出了突出贡献的主要组合数学家有以下几位:

    1.Patric Osergard

    他的主要贡献是用了全新的模拟冷却算法解决了旋转矩阵的构造问题,运用他的模拟冷却程序,可以很迅速的产生许许多多的旋转矩阵。

    2.Alex Sidorenko

    他研究出了许多旋转矩阵和几种产生旋转矩阵的基于图灵理论的一般方法。

    3.Greg Kuperberg

    他注意到线性的[v,t]编码的补集可以给出区组长度不定的覆盖设计,而这可以产生对现有的旋转矩阵的一系列改进。

    4.Dan Gordon

    他不仅是覆盖设计领域内多篇经典论文的合作者,而且总结了所有的旋转矩阵的成果,并且时时关注着该领域的最新进展。他收集的旋转矩阵是迄今为止最全面、最权威的。而这一切全凭他个人的兴趣,没有任何经费的支持。

    以下我将对以上的数学家作一些介绍:

    Dan Gordon是圣地亚哥的通讯研究中心的研究员。个人兴趣:计数理论、组合学、代数分析。

    Greg Kuperberg是美国加州大学的数学系的副教授。主要研究方向是复杂性分析和微积分。他在覆盖设计的主要论文有:

    (1)Asymptotically optimal covering designs(with Daniel Gordon,Oren Patashnik,and Joel Spe-ncer).J.Combin.Theory Ser.A 75(1996),page 270-280.

    (2)Highly saturated packings and reduced coverings(with Gabor Fejes Toth and Wlodzimierz Kuperberg).Monats.Math.125(1998),page 127-145.

    Patric Ostergard是芬兰赫尔辛基理工大学计算科学和工程系的教授。

    他的兴趣集中在数学和计算机科学中系列问题。他的主要研究方向可分为以下几类:

    (1)组合结构的设计

    编码(覆盖编码,纠错编码等等)

    组合设计

    几何填装和覆盖问题

    (2)局部搜索的优化

    模拟冷却算法

    禁忌搜索

    全局优化的随机方法

    (3)加密与解密

    他是1996寇克曼奖的得主,这个奖是由国际组合学协会颁发的,以已故的著名组合学家寇克曼的名字来命名,用来奖励对组合学有突出贡献的数学家。除此之外,他还是组合设计杂志的编辑。

    他在覆盖设计的主要贡献是彩了模拟冷却方法研究出了全新的构造覆盖设计的全新方法。

    他在此领域的主要论文:

    Nurmela,K.J.and Ostergard,P.R.J.“Constructing Covering Designs by Simulated Annealing”,Helsinki University of Technology Digital Systems Laboratory Series B:Technical Reports,No.10;January,1993.

    (二)旋转矩阵的主要算法

    旋转矩阵的定义是很容易明白的,一般的业余数学爱好者理解没有任何障碍。然而,如何快速有效的构造旋转矩阵是一个数学家们一直在研究的问题。当然,这其中最关键的就是算法。而近年来最好的算法无疑是模拟冷却算法,它主要是由Patric Ostergard首创,并且得到了许多后来者的发展。

    下面我简要介绍一下他论文所用的算法的主要思想。

    1.Simulated Annealing模拟冷却算法

    模拟冷却算法是一种随机搜索方法,它的主要特点是不用穷遍集合中每一种可能性就可以找到最优或几乎最优的状态。它是通过模拟一个分子系统的自然冷却过程来做到这一点的。在每一种状态,它随机地选择了一种相邻的状态,如这种相邻的状态有一个更低的成本,系统将会转移到该状态。如果这种相邻的状态有一个更高的成本,系统将可能会转移到该状态,也可能不会转移到该状态。转移的概率依赖现在的状态的温度参数(该值越高,转移的概率越大)和两个状态之间的成本的差异(差异越大,转移的概率越大)。温度将会渐渐低下来,最终会达到均衡。模拟冷却算法常常用来尝试发现离散数学中一些问题的几乎最优的解。

    模拟冷却算法的一般步骤如下:

    1. 给定一个初始状态和初始温度
    2. 外部循环
    3. 内部循环
      1. 随机选择一个相邻状态。若相邻状态的成本更低,转移
      2. 若相邻状态的成本更高,转移的概率为exp{-成本差异/温度}
    4. 降低温度
    5. 返回所遇到的最优状态

    模拟冷却算法的设计者需要选择以下6个参数:

    • 初始温度和初始状态
    • 一种状态的成本函数
    • 一种状态的相邻函数
    • 冷却程序
    • 内部循环方法
    • 外部循环方法

    初始状态和初始温度实际上对算法影响不大,成本函数一般来说也比较容易定义,尤其是对覆盖设计来说,成本可以定义成重复数字的总个数。相邻函数也可以随机挑选一个向量来解决。而有效的冷却程序一般用T'=rT,这里T指原来的温度,T'是新的温度,r是常数,也叫冷却因子。

    Patric Ostergard的关于覆盖设计的经典论文基本上就是如此定义模拟算法的参数的。

    运用该算法,可以很容易算出一般的旋转矩阵。

    除了模拟冷却算法之外,还有另外一些构造旋转矩阵的常用方法。

    2.非连通的集合来结合覆盖设计

    如果对某个v=v1+v2v=v1+v2和所有的t1+t2=tt1+t2=t,都有大小为N1N1的覆盖设计(v1,k1,t1)(v1,k1,t1)和大小为N2N2的覆盖设计(v2,k2,t2)(v2,k2,t2)存在,那么将有大小为N=N1N2N=N1∗N2的覆盖设计存在。然而,可以用这种方法产生的旋转矩阵数量很少,而且构造的过程也很复杂。很少的旋转矩阵是用这种方法产生的。

    3.贪婪算法

    这种算法产生了许多许多的旋转矩阵,这种算法的核心思想是:每个区组都尽可能少重复前面区组的数字,一直重复下去,直到你得到一个覆盖设计。你可以用顺序、逆序或灰色、随机的顺序来重复这个过程。或者可以用你所喜欢的其它顺序。事实上,笔者起初的时候正是用这个方法来产生一些比较简单的矩阵,但是这种算法看起来容易,实际上却十分繁琐,如果不用计算机,即使是很简单的矩阵,也要耗费无数的精力。而且,这种算法只能保证可以产生旋转矩阵,却无法保证产生的旋转矩阵一定是最优的。当参数很大时,用它产生的矩阵离最优的矩阵还差的很远。

    但是,可以用这种方法产生旋转矩阵,然后利用其他的优化算法对它再进一步优化,这样可以产生比较优良的旋转矩阵。

    4.诱致算法

    Greg Kuperberg是这种算法的主要创立者和提倡者。

    先利用一个巨大的参数为(V,K,t)(V,K,t)的旋转矩阵,从VV个点中按照某种顺序或完全随机的选出vv个点,然后将用他们原来的长度为K的区组隔断,得到了每个区组个数不定的一个覆盖。最后,将这个覆盖进行如下的修补即可:对每一个长度为1的区组,将该区组替换成一个(1,k,t)(1,k,t)的覆盖设计。这是一种比较复杂的算法,然而,却是迄今最好的算法之一。

    运用它可以产生优化程度比较高的矩阵。然而,运用这种算法的一个很大的限制是,必须要有一个参数很大的旋转矩阵和许许多多的参数比它小的矩阵。

    这样的条件比较苛刻,所以它的运用不是十分广泛。

    三、旋转矩阵如何提高中奖概率

    (一)对彩票中一些常用的概率的理解

    彩票之所以能够吸引成千上万的彩民,是因为它给许多人提供了一夜暴富的机会。而且成本很小,两元钱的投入就可能带来数以百万的回报。然而,它的每百万的大奖都是由上百万张没有中奖的彩票提供的。中大奖的机会微乎其微,这正是彩票的本质与魅力根源。

    尽管彩票中大奖的机会都十分小,然而各种不同彩票中大奖的概率还是有大差别的,比如32选7的北京风采中一等奖的概率为:

    而36选7的北京体彩中一等奖的概率仅为:

    简而言之,彩票号码球的个数越少,中大奖的机会就越大,而同样数目的号码球,选5型的比选7型的中大奖的机会更大。当然,天下不会有免费的午餐,中大奖的机会越大,大奖累种的奖金额越小。越难中的大奖,它累积的大奖金额越高。

    一些人买彩票的心态可以分为两种,一种是瞄准百万大奖的,梦想着有朝一日可以改变自己的生活。这种彩民一般并不在意中奖的机会有多渺茫,而比较关心本期累积的大奖奖金有多高。另一种则更希望经常在彩市中有所斩获得一些不大不小的奖。这种人比较适合玩中奖机会稍大的彩票,如上海的天天彩与体彩的“四花选四”。这两种彩票中奖机会都比较高。

    除了考虑奖金最高的一等奖,还要考虑次等级的二等奖、三等奖,它们的奖金虽不如一等奖那么高,也颇为丰厚。那么,如果买单注的话,中这些级别的奖的概率都可以算出来。但是,如果买多注的话,如何计算中各个级别的概率呢?如果这些注数胡乱买的,相互之间没有经过科学组合,那么应该如何估计中奖概率呢?

    旋转矩阵利用科学的组合方式提高了这种中奖概率。


    (二)组合投注的中奖概率分析

    不妨举个例子,以北京体彩(36选7)为例进行分析。比如我买了一注,那么中二等奖(6个正选号,无特别号)的概率可以用如下方法计算:

    现在我想买10个号,如果用复式投注的话,需要买120注,中二等奖的概率可以这样计算:因为只有选的10个号中至少有6个正选号才可能出现二等奖。复式投注实际上由于各注之间重复的号码太多可以效率很低。

    如果用旋转矩阵来投注的话,10个号码,需要购买10注。旋转矩阵的含义是,只要选的10个号中包含了7个正选号,一定含有二等奖。如果10个号中包含了6个正选号,也有可能有二等奖。

    各种方式具体中奖概率比较:

    1.假设用复式投注

    若10个号码中含全部正选号;此条件下中二等奖的概率为100%,此条件发生概率为:

    若10个号中含6个正选号,此条件下中二等奖的概率为100%,此条件发生概率为:

    若10个号中含的正号少于6个,此条件下中二等奖的概率为0;

    根据全概率公式,复式投注中二等奖概率为:

    也就是说,旋转矩阵用的注数为复式投注的1/12,而中二等奖的概率却是复式投注的1/3,从数字的利用效率来说,旋转矩阵组合号码的效率大约是复式投注的4倍。从成本收益对比来看,旋转矩阵具有明显的优势。

    (三)旋转矩阵中奖的上下限分析

    可以分析如果你选中某些正选号的情况下中奖情况(具体见平衡式旋转矩阵那一章)。

    旋转矩阵为什么可以提高中奖的概率呢?

    实际上,笔者一再强调天下没有免费的午餐。旋转矩阵之所以可以比复式投注与一般组合平均每注中二等奖概率要高,是以它牺牲中二等奖时的注数为前提的。举个例子,就可以明白这个问题了。

    比如你准备选01,02,03,04,05,06,07,08,09,10这10个号,买10注有几种组合方式,如:

    (1)最极端的方式:01,02,03,04,05,06,07,同样的号连买10注。

    (2)一般组合方式:如轮次矩阵,10注。表2-1:10个号码组合轮次矩阵

    1. 01 02 03 04 05 06 07
    2. 02 03 04 05 06 07 08
    3. 03 04 05 06 07 08 09
    4. 04 05 06 07 08 09 10
    5. 05 06 07 08 09 10 01
    6. 06 07 08 09 10 01 02
    7. 07 08 09 10 01 02 03
    8. 08 09 10 01 02 03 04
    9. 09 10 01 02 03 04 05
    10. 10 01 02 03 04 05 06

    (3)旋转矩阵方式:10注。表2-2:10个号码(7,六)型旋转矩阵(10注)

    1. 01 05 06 07 08 09 10
    2. 02 03 04 06 07 08 09
    3. 02 03 04 05 07 08 10
    4. 02 03 04 05 06 09 10
    5. 01 03 04 05 06 07 08
    6. 01 02 04 05 06 07 09
    7. 01 02 03 05 06 07 10
    8. 01 02 03 05 08 09 10
    9. 01 02 04 06 08 09 10
    10. 01 03 04 07 08 09 10

    假设开出的中奖号码正选号即为01,02,03,04,05,06,07,那么显然第一种方法中的奖最多,为10个特等奖;系二种方法次之,有1个特等奖和2个二等奖;旋转矩阵只有3个二等奖。

    假设开出的中奖号码为02,03,04,05,06,07,08

    第一种方法有10个二等奖;

    第二种方法有1个特等奖和2个二等奖;

    第三种方法有2个二等奖。

    假设开出的号码为01,02,04,05,07,08,09

    第一种方法:没有二等奖;

    第二种方法:没有二等奖;

    第三种方法:1个二等奖。

    从以上可以看出,旋转矩阵的优势在于它比较均匀,只要选对7个正选号,无论是哪7个,它都能保证二等以上的奖。而一般组合方法,在某种情况下,可能会得一堆二等奖,其它情况可能只会得很小的奖。

    当然,从以上例子可以看出,在某些情况下,旋转矩阵得的奖比一般组合方式要少。这是由于旋转矩阵尽量分散了风险所致。实际上,旋转矩阵正如保险一样,它使你的收益更加确定。当然,在某些情况下,你收益可能会减少,但总体来说,稳定的收益更符合人的天性。

    此外,旋转矩阵中蕴含的修习的原理在整个保险的保费确定和保险经营中都得到了应用。实际上,旋转矩阵中蕴含的深刻的组合设计理论近百年来一直吸引着数学家,至今仍有许多这方面未解的难题。旋转矩阵以其无穷的魅力,激励着一代代数学家去突破、解决。

    本文转自罗兵博客园博客,原文链接:http://www.cnblogs.com/hhh5460/p/5677733.html ,如需转载请自行联系原作者
    展开全文
  • %这里随机生成两个四元数 q1 和 q2 作为测试数据 q1 = rand(1,4); q2 = rand(1,4); q1 = q1./norm(q1); q2 = q2./norm(q2); %计算俩个四元数之间的旋转角度差值(单位度数) 2*acos(abs(sum(q1.*q2)))*180/pi %...

    %matlab测试代码

    %这里随机生成两个四元数 q1 和 q2 作为测试数据

    q1 = rand(1,4);
    q2 = rand(1,4);
    q1 = q1./norm(q1);
    q2 = q2./norm(q2);

    %计算俩个四元数之间的旋转角度差值(单位度数)

    2*acos(abs(sum(q1.*q2)))*180/pi

    %将这两个四元数转为旋转矩阵

    r1 = quat2rotm(q1);
    r2 = quat2rotm(q2);

    %计算俩个旋转矩阵之间的旋转角度差值(单位度数)
    diff_r = r1*r2';
    acos((trace(diff_r)-1)/2)*180/pi

    展开全文
  • 计算两个对应点集之间的旋转矩阵R和转移矩阵T

    万次阅读 热门讨论 2018-05-05 23:06:35
    为了寻找这两个点集之间的旋转矩阵RRR和转移矩阵ttt。可以将这个问题建模成如下的公式: B=R∗A+tB=R∗A+tB = R*A+t 为了寻找RRR和ttt,通常需要一下三个步骤: 计算点集合的中心点 将点集合移动到原点,...

    这篇文章的相应数学推到在这个地方,有兴趣的可以瞧一瞧计算两个点集合的旋转矩阵R和T的数学推导
    假设有两个点集A和B,且这两个点集合的元素数目相同且一一对应。为了寻找这两个点集之间的旋转矩阵 R R R和转移矩阵 t t t。可以将这个问题建模成如下的公式:
    B = R ∗ A + t B = R*A+t B=RA+t
    为了寻找 R R R t t t,通常需要一下三个步骤:

    • 计算点集合的中心点
    • 将点集合移动到原点,计算最优旋转矩阵 R R R
    • 计算转移矩阵 t t t

    计算中心点

    P = [ x y z ] μ A = 1 N ∑ i = 1 N P A i μ B = 1 N ∑ i = 1 N P B i P = \left[ \begin{matrix} x\\ y \\ z\end{matrix} \right] \\ \mu_A = \frac{1}{N} \sum_{i=1}^{N} P_{A}^i \\ \mu_B = \frac{1}{N} \sum_{i=1}^{N} P_{B}^i P=xyzμA=N1i=1NPAiμB=N1i=1NPBi

    将点集合移动到原点,计算最优旋转矩阵 R R R

    为了计算旋转矩阵 R R R,需要消除转移矩阵 t t t的影响,所以我们首先需要将点集重新中心化,生成新点集合 A ′ A' A B ′ B' B,然后计算性的点集之间的协方差矩阵:

    点集重新中心化

    A i ′ = { P A i − μ A } B i ′ = { P B i − μ B } A'_i = \{ P_A^i-\mu_A\} \\ B'_i = \{ P_B^i-\mu_B \} Ai={PAiμA}Bi={PBiμB}
    注意其中的, P A i P_A^i PAi 、$ P_B^i$ 、 μ A \mu_A μA μ B \mu_B μB不是标量是向量。

    计算点集之间的协方差矩阵H

    H = ∑ i = 1 N A i ′ B i ′ T = ∑ i = 1 N ( P A i − μ A ) ( P B i − μ B ) T H = \sum_{i=1}^{N}A_{i}^{'} {B_{i}^{'}}^T \\ = \sum_{i=1}^{N} (P_A^i-\mu_A)(P_B^i-\mu_B)^T H=i=1NAiBiT=i=1N(PAiμA)(PBiμB)T
    通过SVD方法获得矩阵的 U U U S S S V V V,可以计算点集之间的旋转矩阵 R R R

    [ U , S , V ] = S V D ( H ) R = V U T \left[ U,S,V\right] = SVD(H) \\ R = VU^T [U,S,V]=SVD(H)R=VUT

    计算转移矩阵 t t t

    最后,通过 R R R可以获得转移矩阵 t t t
    t = − R × μ A + μ B t = -R\times \mu_A + \mu_B t=R×μA+μB

    下面通过python代码编写一个小例子验证一下上面的公式。
    下面这个例子,首先通过随机函数生成两个三维点集A,旋转矩阵 R R R t t t。通过公式 B = R A T + t B=RA^T+t B=RAT+t获得新的点集B。然后通过上述的方法计算点集A和B之间的旋转矩阵 R ′ R' R t ’ t’ t,通过公式 B ′ = R ′ A T + t ′ B'=R'A^T+t' B=RAT+t生成新的点集合B’。并计算两个点集合之间的RMSE。

    from numpy import *
    from math import sqrt
    from mpl_toolkits.mplot3d import Axes3D
    import matplotlib.pyplot as plt
    
    
    def rigid_transform_3D(A, B):
        assert len(A) == len(B)
        N = A.shape[0];
        mu_A = mean(A, axis=0)
        mu_B = mean(B, axis=0)
    
        AA = A - tile(mu_A, (N, 1))
        BB = B - tile(mu_B, (N, 1))
        H = transpose(AA) * BB
    
        U, S, Vt = linalg.svd(H)
        R = Vt.T * U.T
    
        if linalg.det(R) < 0:
            print "Reflection detected"
            Vt[2, :] *= -1
            R = Vt.T * U.T
    
        t = -R * mu_A.T + mu_B.T
    
        return R, t
    
    if __name__=='__main__':
    
        R = mat(random.rand(3,3))
        t = mat(random.rand(3,1))
    
        U,S,Vt = linalg.svd(R)
        R = U*Vt
        if linalg.det(R) < 0:
            Vt[2,:]*=-1
            R = U*Vt
    
        n = 10
    
        A = mat(random.rand(n,3))
        B = R*A.T + tile(t,(1,n))
        B = B.T
    
        ret_R, ret_t = rigid_transform_3D(A,B)
        A2 = (ret_R*A.T)+ tile(ret_t,(1,n))
        A2 =A2.T
    
        err = A2-B
    
        err = multiply(err,err)
        err = sum(err)
        rmse = sqrt(err/n)
    
        print "points A2"
        print A2
        print ""
    
        print "points B"
        print B
        print ""
        print rmse
        fig = plt.figure()
        ax=fig.add_subplot(111,projection='3d')
        ax.scatter(A[:,0],A[:,1],A[:,2])
        ax.scatter(B[:,0],B[:,1],B[:,2],s=100,marker='x')
        ax.scatter(A2[:,0],A2[:,1],A2[:,2],s=100,marker= 'o')
        plt.legend()
        plt.show()
    

    通过上述代码生成的点集 B ′ B' B B B B中的所有元素如下所示:

    points A2
    [[0.65985419 1.60528398 1.38340275]
     [0.92739301 1.68052107 0.90692937]
     [0.3398634  1.20672748 1.24869353]
     [0.76117272 1.46282089 1.35712503]
     [0.45657103 1.17657746 0.9993309 ]
     [0.86068981 1.76370772 0.53447625]
     [0.46723696 0.98764769 1.06947054]
     [0.67152812 1.00675099 0.73363394]
     [0.3102857  1.23971537 0.86977264]
     [0.495524   1.10873545 0.93223688]]
    
    points B
    [[0.65985419 1.60528398 1.38340275]
     [0.92739301 1.68052107 0.90692937]
     [0.3398634  1.20672748 1.24869353]
     [0.76117272 1.46282089 1.35712503]
     [0.45657103 1.17657746 0.9993309 ]
     [0.86068981 1.76370772 0.53447625]
     [0.46723696 0.98764769 1.06947054]
     [0.67152812 1.00675099 0.73363394]
     [0.3102857  1.23971537 0.86977264]
     [0.495524   1.10873545 0.93223688]]
    

    上面小程序的可视化结果如下所示。其中,绿色的圆球和红色的"X"分别表示利用上述方法生成点集 B ′ B' B B B B。蓝色的小圆球表示点集合 A A A
    这里写图片描述

    【引用】

    1. Finding optimal rotation and translation between corresponding 3D points
    展开全文
  • matlab欧拉角算旋转矩阵代码
  • 随机生成某些稀疏矩阵

    千次阅读 2016-01-11 11:27:39
    1.单位稀疏矩阵 函数 speye 格式 S = speye(m,n) %生成m×n的单位稀疏矩阵 ...格式 R = sprand(S) %生成与S具有相同稀疏结构的均匀分布随机矩阵 R = sprand(m,n,density) %生成一个m×n的服
    1.单位稀疏矩阵
    

    函数 speye

    格式 S = speye(m,n)   %生成m×n的单位稀疏矩阵

    S = speye(n)     %生成n×n的单位稀疏矩阵

    2.稀疏均匀分布随机矩阵

    函数 sprand

    格式 R = sprand(S)           %生成与S具有相同稀疏结构的均匀分布随机矩阵

    R = sprand(m,n,density)    %生成一个m×n的服从均匀分布的随机稀疏矩阵,非零元素的分布密度是density。

    R = sprand(m,n,density,rc)   %生成一个近似的条件数为1/rc、大小为m×n的均匀分布的随机稀疏矩阵。

    3.稀疏正态分布随机矩阵

    函数 sprandn

    格式 R = sprandn(S)            %生成与S具有相同稀疏结构的正态分布随机矩阵。

    R = sprandn(m,n,density)    %生成一个m×n的服从正态分布的随机稀疏矩阵,非零元素的分布密度是density。

    R = sprandn(m,n,density,rc)   %生成一个近似的条件数为1/rc、大小为m×n的均匀分布的随机稀疏矩阵。

    4.稀疏对称随机矩阵

    函数 sprandsym

    格式 R = sprandsym(S)   %生成稀疏对称随机矩阵,其下三角和对角线与S具有相同的结构,其元素服从均值为0、方差为1的标准正态分布。

    R = sprandsym(n,density)    %生成n×n的稀疏对称随机矩阵,矩阵元素服从正态分布,分布密度为density(稀疏密度)。

    R = sprandsym(n,density,rc)   %生成近似条件数为1/rc的稀疏对称随机矩阵

    R = sprandsym(n,density,rc,kind)   %生成一个正定矩阵,参数kind取值为kind=1表示矩阵由一正定对角矩阵经随机Jacobi旋转得到,其条件数正好为1/rc;kind=2表示矩阵为外积的换位和,其条件数近似等于1/rc;kind=3表示生成一个与矩阵S结构相同的稀疏随机矩阵,条件数近似为1/rc ,density被忽略。

    展开全文
  • 其实您错了,世界上并没有绝对理想的随机数,就算是用电脑也只能产生接近随机的数:在彩票开奖产生号码时,诸如摇奖机的物理特性、每个球的重量和光滑度的差异、空气的流动性等等都会使开奖结果产生一定的偏态,在中...
  • C#实现N*N的顺时针旋转矩阵

    千次阅读 2013-06-19 20:38:15
    看面试算法题突然想到大学时写的一算法题 using System; using System.Collections.Generic;...using System.Linq;...//输出按n时的矩阵 namespace n时矩阵 ...随机生成边长在1~20中的矩阵
  • http://simulations.narod.ru/ 生成正则 simpex,函数 simplex.m 单纯形是多维四面体 也random_rotation.m-生成随机旋转矩阵 运行 zz_plot_simplex_in_2d.m 生成单纯形,随机旋转,投影到 2d,在 2d 中绘制单纯形
  • 在做人脸或物体检测的任务中,往往需要对训练集进行随机旋转,做数据增强,增加模型的鲁棒性。 在进行图像随机旋转的同时,相应的label值坐标也要进行相应的旋转...坐标(x,y)顺时针旋转 β 度,则经过矩阵相乘,转
  • 旋转随机森林算法

    2018-09-07 19:00:00
    当输入数据中存在非线性关系的时候,基于线性回归的模型就会失效,而基于树的...不过如果我们生成大量的树,最终的预测值采用集成所有树产生的输出的平均值,就可以避免方差的问题。 1. 随机森林:集成技术,采用大...
  • 今天主要是来研究梅森旋转算法,它是用来产生随机数的,实际上产生随机数的方法有很多种,比如线性同余法, 平方取中法等等。但是这些方法产生的随机数质量往往不是很高,而今天介绍的梅森旋转算法可以产生高...
  • 今天主要是来研究梅森旋转算法,它是用来产生随机数的,实际上产生随机数的方法有很多种,比如线性同余法, 平方取中法等等。但是这些方法产生的随机数质量往往不是很高,而今天介绍的梅森旋转算法可以产生高...
  • 版权声明:本文为博主徐松亮的原创作品,未经允许不得转载,多谢支持!...生成(或随机选定)种子矩阵终盘 两数交换法 非跨界行交换 非跨界列交换 块行交换 块列交换 矩阵旋转 矩阵行镜像 ...
  • ·a:旋转矩阵的参数 ·f:初始化梅森旋转链所需参数 ·b,c:TGFSR的掩码 ·s,t:TGFSR的位移量 ·u,d,l:额外梅森旋转所需的掩码和位移量 MT19937-32的参数列表如下: ·(w, n, m, r) = (32, 624, 397, 31)...
  • matlab 稀疏矩阵生成

    千次阅读 2019-02-27 15:01:48
    1.单位稀疏矩阵 函数 speye 格式 S = speye(m,n) %生成m×n的单位稀疏矩阵 ...格式 R = sprand(S) %生成与S具有相同稀疏结构的均匀分布随机矩阵 R = sprand(m,n,density) %生成一个m×n的服...
  • matlab中有许多的特殊矩阵,有通用矩阵,如:零矩阵、全1矩阵随机矩阵等,也有专用学科的特殊矩阵,如:魔方矩阵、希尔伯特矩阵等。matlab也有对应的函数来生成和处理这些矩阵,这篇文章将会整理出一些特殊矩阵中会...
  • M*N矩阵顺时针旋转90度

    千次阅读 2014-06-19 15:00:43
    问题:如下的4*3矩阵A1:
  • Mersenne Twister算法译为马特赛特旋转演算法,是伪随机数发生器之一,其主要作用是生成随机数。此算法是Makoto Matsumoto (松本)和Takuji Nishimura (西村)于1997年开发的,基于有限二进制字段上的矩阵线性再生。...
  • 具体方法如下:将矩阵的元素用方括号括起来,按矩阵行的顺序输入各元素,同一行的各元素之间用空格或逗号分隔,不同行的元素之间用分号分隔。+2.利用M文件建立矩阵++++对于比较大且比较复杂的矩阵,可以为它专门...
  • 在做人脸或物体检测的任务中,往往需要对训练集进行随机旋转,做数据增强,增加模型的鲁棒性。 在进行图像随机旋转的同时,相应的Label值坐标,如人脸关键点检测中人脸对应的关键点坐标,物体检测任务中的物体所在...
  • 矩阵矩阵生成1.直接生成矩阵用[]来表示,同行元素之间由空格或者逗号分隔,行与行之间用分号或回车分隔;矩阵的大小不用事先定义。>> a=[1,2;3,45,6]a =1 23 45 62.利用m文件或者txt文件生成注意m或者txt文件...
  • 当输入数据中存在非线性关系的时候,基于线性回归的模型就会失效...不过如果我们生成大量的树,最终的预测值采用集成所有树产生的输出的平均值,就可以避免方差的问题。1. 随机森林:集成技术,采用大量的树来建模,...
  • 1.在MB中,向量的编号是竖着计数的。 2.变量扩张x=[1 2 3 4];...4.M文本法生成矩阵,用.m作为后缀 5.几个特殊矩阵zeros,eye,ones,rand,randn(正态随机)。 6.多维矩阵cat函数,cat(n,A1......)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,908
精华内容 7,563
关键字:

旋转矩阵随机生成