矩阵

D3D中的世界矩阵,视图矩阵,投影矩阵

爷,独闯天下 提交于 2020-01-20 00:37:42
无论计算机图形技术如何发展,只要它以二维的屏幕作为显示介质,那么它显示的图像即使多么的有立体感,也还是二维的。有时我会想,有没有以某个空间作为显示介质的的可能呢,不过即使有,也只能是显示某个范围内的图像,不可能有无限大的空间作为显示介质 ,如果有,那就是现实世界了。 既然显示器的屏幕是二维的,那么我们就要对图像作些处理,让它可以欺骗我们的眼睛,产生一种立体的真实感。在D3D中,这种处理就是一系列的空间变换,从模型空间变到世界空间,再变到视图空间,最后投影到我们的显示器屏幕上。 ·世界空间与世界矩阵 什么是模型空间呢?每个模型(3D物体)都有它自己的空间,空间的中心(原点)就是模型的中心。在模型空间里,只有模型上的不同点有位置的相对关系。那什么是世界空间呢?世界就是物体(模型)所存在的地方。当我们把一个模型放进世界里面去,那么它就有了一个世界坐标,这个世界坐标是用来标记世界中不同的模型所处的位置的。在世界空间里,世界的中心就是原点(0, 0, 0),也就是你显示器屏幕中间的那一点。我们可以在世界空间里摆放很多个模型,并且设置它们在世界空间中的坐标,这样模型与模型之间就有了相对的位置。 世界矩阵有什么用呢?我们可以利用它来改变世界空间的坐标。这样,在世界空间里面的模型就可以移动、旋转和缩放了。 我们可以使用上一章末尾所讲的那几个函数来产生世界矩阵。例如产生一个绕X轴旋转的转阵

矩阵的逆矩阵和行列式值的递归算法。

白昼怎懂夜的黑 提交于 2020-01-20 00:32:31
很久没有写过C语言,今天写了一个关于矩阵的算法 完整代码如下: #include<atlstr.h> #include<iostream> #include<string> using namespace std; //创建矩阵 float **Creat(int n) { float **array=new float*[n]; for(int i=0;i<n;i++) { array[i]=new float[n]; } printf("请输入矩阵:\n"); for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { cin>>array[i][j]; } } return array; } //求行列式的值: float Value(float **array,int n) { float Result=0; if(n==1) return array[0][0]; float **temp=new float*[n-1]; for(int i=0;i<n-1;i++) { temp[i]=new float[n-1]; } for(int i=0;i<n;i++) { for(int j=0;j<n-1;j++) { for(int k=0;k<n-1;k++) { int flag; if(j<i) flag=0; else flag=1

剑指offer(1-10题)详解

浪尽此生 提交于 2020-01-20 00:04:33
文章目录 01二维数组的查找 02替换空格 03从尾到头打印链表 04重建二叉树★ 05 用两个栈实现队列 06旋转数组的最小数字 07 斐波那契数列 08 跳台阶 09 变态跳台阶 10 矩阵覆盖 欢迎关注个人 数据结构专栏 哈 微信公众号:bigsai 声明:大部分题基本未参考题解,基本为个人想法,如果由效率太低的或者错误还请指正!,如果有误导,还请指正! 01二维数组的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 思路 : 选定一个维度(行或列)先找到需要查找的元素所在的 行 (列),再从该 行 (列)找到该元素的该元素具体的列(行)位置。复杂度O(n)。 优化:因为数列是递增有序的,可以进行二分查找进行优化,但是 本题可以不进行二分也可以过 。因为大家有兴趣可以去查一查编程语言数组可以开多大。然后单个查找在这个范围内即使不优化也不会超时。有兴趣的可以自己写一写二分!复杂度O(logn) 代码: public class Solution { public boolean Find ( int target , int [ ] [ ] array ) { if ( array . length == 0 ||

Python_矩阵转置

生来就可爱ヽ(ⅴ<●) 提交于 2020-01-19 22:27:56
矩阵转置:行变列,列变行 算法:列元素放到新列表的行 list01 = [ [ 1 , 2 , 3 , 4 ] , [ 5 , 6 , 7 , 8 ] , [ 9 , 10 , 11 , 12 ] ] # 转置 list02 = [ ] for c in range ( len ( list01 [ 0 ] ) ) : line = [ ] for r in range ( len ( list01 ) ) : line . append ( list01 [ r ] [ c ] ) list02 . append ( line ) # 打印成表格 for line in list02 : for item in line : print ( item , end = "\t" ) print ( ) 运行结果 1 5 9 2 6 10 3 7 11 4 8 12 来源: CSDN 作者: Rookie_Max 链接: https://blog.csdn.net/Rookie_Max/article/details/104044832

数学基础系列(六)----特征值分解和奇异值分解(SVD)

て烟熏妆下的殇ゞ 提交于 2020-01-19 19:31:11
一、介绍   特征值和奇异值在大部分人的印象中,往往是停留在纯粹的数学计算中。而且线性代数或者矩阵论里面,也很少讲任何跟特征值与奇异值有关的应用背景。   奇异值分解是一个有着很明显的物理意义的一种方法,它可以将一个比较复杂的矩阵用更小更简单的几个子矩阵的相乘来表示,这些小矩阵描述的是矩阵的重要的特性。就像是描述一个人一样,给别人描述说这个人长得浓眉大眼,方脸,络腮胡,而且带个黑框的眼镜,这样寥寥的几个特征,就让别人脑海里面就有一个较为清楚的认识,实际上,人脸上的特征是有着无数种的,之所以能这么描述,是因为人天生就有着非常好的抽取重要特征的能力,让机器学会抽取重要的特征,SVD是一个重要的方法。   在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做feature reduction的PCA,做数据压缩(以图像压缩为代表)的算法,还有做搜索引擎语义层次检索的LSI(Latent Semantic Indexing)   特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法。两者有着很紧密的关系,接下来会谈到特征值分解和奇异值分解的目的都是一样,就是 提取出一个矩阵最重要的特征 。   首先来看看向量的表示及基变换   向量可以表示为(3,2),实际上表示线性组合:$x(1,0)^{T}+y(0,1)^{T}$      基:(1,0)和(0,1

01-简述

耗尽温柔 提交于 2020-01-19 17:26:51
1. 几个经典算法题 字符串匹配 KMP算法(部分匹配表) 汉诺塔 分治算法 八皇后 回溯算法 马踏棋盘(骑士周游) 图的深度优先遍历算法(DFS) + 贪心算法优化 2. 数据结构和算法的关系 2.1 数据结构 解决存储问题 把现实生活中大量而复杂的问题以特定的数据类型(事物)和特定的存储结构(事物的关系)保存到存储器中 数据的存储 = 数据的存储 + 数据关系的存储 2.2 算法 在存储结构的基础上实现某个功能而执行的操作,这个相应的操作也叫做 [算法] // 算法就是对数据的操作 广义 | 狭义 上的算法 狭义的算法:与数据的存储方式密切相关 广义的算法:与数据的存储方式无关 2.3 关系 程序 = 数据结构 + 算法 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言 数据结构是算法的基础 3. 看几个实际编程中遇到的问题 试写出用单链表表示的字符串类及字符串结点类的定义,并依次实现它的构造函数、以及计算串长度、串赋值、判断两串相等、求子串、两串连接、求子串在串中位置等7个成员函数 数据结构:单链表 五子棋程序:如何判断游戏的输赢,并可以完成 {存盘退出} 和 {继续上局} 的功能 存盘退出:棋盘 → 二维数组 → 稀疏数组 → 写入文件 继续上局:读取文件 → 稀疏数组 → 二维数组 → 棋盘 约瑟夫问题(丢手帕问题):设编号为1,2,… n的n个人围坐一圈

Mat与图像的基本概念

孤街浪徒 提交于 2020-01-19 16:53:31
三通道图像在内存中Mat类型的数据组织形式如下: (这张图是偷的,别打我。。。。) 就是一个三维数组,并且是以BGR的顺序,注意不是RBG!!! 图像类型: CV_8UC1:8位无符号整型单通道矩阵 CV_32FC2:32位浮点型双通道矩阵 通道:表示每个点能存放多少个数,类似于RGB彩色图中的每个像素点有三个值,即三通道的。(C1 C2 C3 C4) 深度:表示每个值由多少位来存储,是一个精度问题,一般图片是8bit(位)的,则深度是8. 来源: https://www.cnblogs.com/helloc14/p/12213992.html

Floyd算法(弗洛伊德算法)

我们两清 提交于 2020-01-19 15:24:30
算法描述:   Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法。从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按一个公式,构造出矩阵D(1);又用同样地公式由D(1)构造出D(2);……;最后又用同样的公式由D(n-1)构造出矩阵D(n)。矩阵D(n)的i行j列元素便是i号顶点到j号顶点的最短路径长度,称D(n)为图的距离矩阵,同时还可引入一个后继节点矩阵path来记录两点间的最短路径。 核心思路:通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。 算法过程:   把图用邻接距阵G表示出来,如果从Vi到Vj有路可达,则G[i,j]=d,d表示该路的长度;否则G[i,j]=无穷大。定义一个距阵D用来记录所插入点的信息,D[i,j]表示从Vi到Vj需要经过的点,初始化D[i,j]=j。把各个顶点插入图中,比较插点后的距离与原来的距离,G[i,j] = min( G[i,j], G[i,k]+G[k,j] ),如果G[i,j]的值变小,则D[i,j]=k。 在G中包含有两点之间最短道路的信息,而在D中则包含了最短通路径的信息。比如,要寻找从V5到V1的路径。根据D,假如D(5,1)=3则说明从V5到V1经过V3,路径为{V5,V3,V1},如果D(5,3)=3,说明V5与V3直接相连,如果D(3

模式识别系列之特征降维(1)主成分分析

半城伤御伤魂 提交于 2020-01-19 11:54:20
目录 1-PCA概述 2-理论推导 2.1-向量的内积与投影: 2.2-基的表示与变换: 2.3-协方差矩阵: 2.4-PCA推导 3-几何理解 4-计算过程 4.1-样本数小于特征数时的计算 4.2-matlab代码 5-实例 参考 1-PCA概述 主成分分析是一种常用的降维方法,它不使用标签信息,通过将原始坐标空间的数据( d × 1 d\times 1 d × 1 )投影到新的正交空间( k × 1 k\times 1 k × 1 )中实现数据降维,所谓的主成分就是指数据在新空间的基的方向。PCA以方差作为信息损失衡量的标准,使得数据降维过程中信息损失最小,即降维后数据的方差要尽量大。PCA首先找到所有数据方差最大的方向,并将其作为新的坐标空间的第一个轴的方向,然后在这个方向的垂直超平面上寻找第二个方差最大的方向,并作为新坐标空间第二个轴的方向,以此类推,直到找到需要的k个方向,也就是K个主成分,显然这k个新的基方向是两两垂直的。PCA的主要过程可以用“扭动坐标轴,保留K个轴”来形容。 为什么要以方差最大为依据呢?降维是为了数据更好地表示与计算,显然我们不希望降维后的数据成了一坨,使得原本分界明显的数据掺和在一起。例如,将数据投影到一维坐标系中,显然绿色的投影更好一些,因为其分散程度大,也就是方差更大。 对n个d维数据构成的数据集 X X X ( d × n d\times