java 向量上的坐标点_矩阵和向量的故事(13)

上篇:矩阵和向量的故事(12)

下篇:矩阵和向量的故事(14)


前篇小结:

1,回忆一下这个矩阵乘法的含义:

;

这是因为矩阵乘法像上节那样操作,矩阵的形状就必须满足这个要求;

这样做之后,那么

是表示A的各个列向量的一个线性组合,这个组合的结果被命名
;那么只要矩阵乘法法则的条件满足,乘法的结果可以用来表示一组向量的线性组合,这组向量也就是A的各列;

怎么用矩阵表示三维空间的一个点

如果用来表示三维空间中的一个点,首先需要的是基底,然后是坐标;

基底是一个向量组

,坐标是一个三元组
;

空间里面在这个坐标系下的点P的坐标是(x,y,z); 那么能够表示点P的向量

;这个表达式里面有足够的信息找到这个点;然后这个代数式还能够看成向量组
的线性组合,取的成分比是x,y,z;

都具有
的列矩阵形式;

如果用一个大的矩阵

组合这三个列矩阵,叫这个矩阵

,按照上节的矩阵乘法有:

;

所以一个空间中的点P表达成

这样一个形式,
是矩阵里面是基底.
也是矩阵,里面是坐标;

ee2249cabd88246ac83d2d4c6fac236c.png

坐标转换

什么是坐标转换?字面上的意思就是坐标值变化了,坐标值是为了定位用的,如果你在一副地图上找路,你放大这幅地图,旋转这个地图,或者直接换另外一副地图,这都可能造成你读的坐标不一样,但是你想定位的地点还是原来的地方,就是这个地方在新的地图里面是别的坐标值,这个过程就是坐标变换。

坐标变换的原因,也就会说坐标值改变的原因,这是因为换图了,换地图了;也可以说换视角,换观察方向;因为坐标值的确定是先有地图,再在地图上读值,换了一副地图,自然从地图上读的坐标不一样;也有例外,为什么有时候读到的值会是一样,因为你的地图换了等于差不多没换,这是很特殊的一种变换,你想一下,如果你换地图要耗费很多的能量,结果,你换了之后还是在原来的位置,那么你耗费的能量跑去哪了呢?同时如果真存在这种变化,这是好事,因为只要研究清楚能量的走向,那么这个系统不就是一个能量传导系统,不改变一个系统的坐标,而耗费能量,那么能量必然转移到别的系统里面去了。前提是,能量守恒定律是有效的,总能量不守恒,就没有这个推理了,所以万一你发现了这样一个系统,消耗能量,不改变任何东西,只是吞能。。。好吧,你成功的干掉了能量守恒定律。

换图的另外一种说法就是,基底向量的变化:

这个式子里面,就是
发生了变化,由于点
不会变化,那么读到的
就会因此改变,点p不改变,因为没有改变的原因,因为整个过程就是在找p点的位置,p点在同样一个地方,只是换不同的视角去看,这个视角是基底

所以现在有两副地图,第一幅地图基底是

,第二幅地图基底是
;这样点p在这两幅地图里面就会有两个读数,
分别对应两个基底;

那么有这个式子成立:

我们关注这个式子的右边那个等式:

,这就是那句话,
不同地图去读同一个位置

假如我们先找到坐标变化的变化公式就是

之间的直接关系;那么我们应该要找到
直接关系;

准确的来说,就是两组基底之间的关系,

的前后对照:

假如这种变化用一个字母替换,transform取首字母

;

这表示

发生变化
,变成
;

这里面有一个很重要的问题,变化

的种类有很多,这是在先发现最简单的线性变化后,然后又发现一些明显不是线性变化,就像先发现北美洲的一角,然后发现整个北美大陆一样,最开始是一个港口,然后一个有一个的城市。

最简单的线性变化是什么?就是恒等变化,

在变化
下是一样的,identity(同一性),经常取首字母
表示;

我们看一下具体的向量组,为了简化,只看二维向量,就是一个平面里面的向量;

对比看一下两组基底

,

74ae25de6260b2dee5414862287b8f1c.png

用代数式描述一个变化T:

注意到上面四个都是二维向量;

实际上这个式子是:

36cc11a543bf2533876ccbfed63a9f15.png

按照矩阵乘法和线性组合补充完上面这个式子:

即:

60dc0459349bd7e283a472678ff5fb47.png

这个也就是

2757580f6fb276c54f98a1d34b5210fa.png

进一步改写:

a9e5734c24eb70b72b2113a431306ab9.png

这样子改写,一个变化

的所有基底信息都被集中在形如下面的矩阵乘法里面:

fee1e6711688945e5a0308d22f271f47.png

,最后一个矩阵代表的就是变化

然后发现这是一个单位矩阵

; 就是说在二维的平面空间里面,这个单位矩阵
对应着这个恒等变化;

可以假设一个变化

对应一个矩阵,或者说矩阵运算组合 ,这个猜测很大胆,因为现在只是对于恒等变换找到了一个矩阵,还有很多其他变换,不知道找到这样的矩阵,甚至能不能改写成矩阵形式。所以这就自然出现了一个研究方向。

线性变化总能找到这样一个矩阵,应该说总能找到一类矩阵;有一些非线性变化也能找到一类矩阵,或者一些矩阵的组合,这种像是命运安排一样的现象本质上都存在原因,或者说从现象回归原因才是探求。

但是不妨碍应用阶段,假设上面结论成立:

那么总是存在一个转换矩阵

我们又知道了空间中表示一个点有:

联合这两个:

就是说有

成立;

所以我们找到了坐标之间的关系:

,这里不是代数一样地消去B,而是这个式子本身就是说在
这个基底下读坐标,读到
,这两个读数是一样的。

小结:

基底变换是:

导致了坐标变换:

/* * 基于数组的向量实现 */ package dsa; public class Vector_Array implements Vector { private final int N = 1024;//数组的容量 private int n = 0;//向量的实际规模 private Object[] A;//对象数组 //构造函数 public Vector_Array() { A = new Object[N]; n = 0; } //返回向量中元素数目 public int getSize() { return n; } //判断向量是否为空 public boolean isEmpty() { return (0 == n) ? true : false; } //取秩为r的元素 public Object getAtRank(int r)//O(1) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); return A[r]; } //将秩为r的元素替换为obj public Object replaceAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; A[r] = obj; return bak; } //插入obj,作为秩为r的元素;返回该元素 public Object insertAtRank(int r, Object obj) throws ExceptionBoundaryViolation { if (0 > r || r > n) throw new ExceptionBoundaryViolation("意外:秩越界"); if (n >= N) throw new ExceptionBoundaryViolation("意外:数组溢出"); for (int i=n; i>r; i--) A[i] = A[i-1];//后续元素顺次后移 A[r] = obj;//插入 n++;//更新当前规模 return obj; } //删除秩为r的元素 public Object removeAtRank(int r) throws ExceptionBoundaryViolation { if (0 > r || r >= n) throw new ExceptionBoundaryViolation("意外:秩越界"); Object bak = A[r]; for (int i=r; i<n; i++) A[i] = A[i+1];//后续元素顺次前移 n--;//更新当前规模 return bak; } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值