矩阵乘法

matlab基础知识

人走茶凉 提交于 2019-11-28 16:08:26
1.ceil(x):向上取整 floor(x):向下取整 2.round(x,y):保留小数点后y位 3.sign(x):判断正负,若为正,则为1;若为负,则为-1;若为0,则为0 4.conj(x):取x的共轭 abs(x):取模 real(x):取x的实部 imag(x):取x的虚部 angle(x):求复数矩阵相位角的弧度值 5.flipu(x):矩阵的第一行与最后一行进行互换 flipdim(x,dim):dim为1,表示每一列进行逆序排列;dim为2,表示每一行进行逆序排列 fliplr(x):实现矩阵沿垂直轴左右翻转 6.mean(x):mean函数是一个求数组平均值的函数 mean(x,dim):dim为1,求每一列的平均值;dim为2,求每一行的平均值 7.length(x):length(x)为数列的长度,即它里面有多少个元素.如果x0是矩阵的话,比方说M行N列,那么length返回M和N这两个数的最大值 8.[b0,ind]=sort(x):按列将矩阵排序,然后找出他们的位置 [b0,ind]=sort(x,2):按行将矩阵排序,然后找出他们的位置 9.dot(a,b):向量的点乘,ps:只能用于向量,不可以用于矩阵 cross(a,b):向量的×乘 10.[m,n]=size(a):求矩阵的行列,行为m,列为n 11.可以用;或者回车换行输入命令 12

Numerical methods in enginering with python3 (1)

你。 提交于 2019-11-28 12:51:09
< > (1) Numpy 库 Numpy中的矩阵函数 np.diagonal(A) 返回由A中的主对角元素组成的一维矩阵 np.diagonal(A,1) 返回由A中的第一副对角元素组成的一维矩阵 np.trace(A) 返回A中的主对角元素的和 np.argmax(A,axis= 0) 在0轴上,最小的数 np.identity(3) 返回3维的单位矩阵 np.dot(a,b) 常用的: 若a,b均为行矩阵,则返回其内积(对应元素相乘,最后再相加,返回值为标量) 若a,b均为n维矩阵,则返回a,b的矩阵的乘法 若a为n维,b为行矩阵,则返回矩阵中的每一个元素,为a矩阵的某行的各个元素与b矩阵的对应元素相乘,再相加。(类似于矩阵的乘法,不过不是行、列乘的关系,而是行行乘) np.inner(a,b) 常用的 若a,b均为行矩阵,则返回其内积(对应元素相乘,最后再相加,返回值为标量) 若a,b均为n维矩阵,则返回矩阵中的每一个元素,为a矩阵的某行的各个元素与b矩阵某行的对应元素相乘,再相加得到的(类似于矩阵的乘法,不过不是行、列乘的关系,而是行行乘) np.outer(a,b) 返回a,b中所有元素对的乘积组成的矩阵 线性代数模块 from numpy.linalg import inv,solve 矩阵的逆 inv(A) 求解Ax = b方程中的x solve(A,b)

卡尔曼滤波器

♀尐吖头ヾ 提交于 2019-11-28 10:46:38
假设有个小车在道路上向右侧匀速运动,我们在左侧安装了一个测量小车距离和速度传感器,传感器每1秒测一次小车的位置s和速度v,如下图所示。 我们用向量xt来表示当前小车的状态,该向量也是最终的输出结果,被称作状态向量(state vector): 由于测量误差的存在,传感器无法直接获取小车位置的真值,只能获取在真值附近的一个近似值,可以假设测量值在真值附近服从高斯分布。 如下图所示,测量值分布在红色区域的左侧或右侧,真值则在红色区域的波峰处。 由于是第一次测量,没有小车的历史信息,我们认为小车在1秒时的状态x与测量值z相等,表示如下: 公式中的1表示第1秒。 预测是卡尔曼滤波器中很重要的一步,这一步相当于使用历史信息对未来的位置进行推测。 根据第1秒小车的位置和速度,我们可以推测第2秒时,小车所在的位置应该如下图所示。 会发现,图中红色区域的范围变大了,这是因为预测时加入了速度估计的噪声,是一个放大不确定性的过程。 根据小车第一秒的状态进行预测,得到预测的状态xpre: 其中,Pre是Prediction的简称;时间间隔为1秒,所以预测位置为距离+速度*1;由于小车做的是匀速运动,因此速度保持不变。 在第2秒时,传感器对小车的位置做了一次观测,我们认为小车在第2秒时观测值为z2,用向量表示第2秒时的观测结果为: 很显然,第二次观测的结果也是存在误差的

快速幂

女生的网名这么多〃 提交于 2019-11-28 08:10:39
快速幂 一. 前言 经历了自闭的多校生活,想着重新回顾一些理解不是很清楚的知识点,于是就写了第一篇文章。思路非常混乱……,如有问题请dalao们指正。 二.快速幂 幂运算是一种常见的运算,最容易想到的累乘法的复杂度为O(n),但很多时候这并不够快,所以出现了快速幂运算。 (为什么不用内置函数pow?)有时候幂运算结果特别大,超出了longlong的范围,这时候答案会要求你取模,这时候用pow函数是肯定不行的。 快速幂运用了倍增的思想,用式子理解就是: b%2==0 a b = * b%2==1 利用这个特性,重复a=a 2 ,b=b/2,我们可以轻松的写出快速幂: 1 2 3 4 5 6 7 8 9 10 11 12 int ksm(int a, int b) { int res = 1; while (b > 0) { if (b % 2 == 1) res *= a; b /= 2; a *= a; } return res; } 例如: res=1, a=3, b=5(初始状态) res=3, a=9, b=2(b=5为奇数,res*=a) res=3, a=81, b=1(b=2 为偶数,res不变) res=243,a=81*81,b=0(res*=a,退出循环,) 模板如下O(nlogn): 1 2 3 4 5 int ksm( int a, int b, int

Fibonacci 矩阵乘法入门

China☆狼群 提交于 2019-11-28 07:13:29
Fibonacci 题意:求斐波那契的第n项,0<=n<=1e9 思路:设f[n][2]为一个1*2的矩阵,表示斐波那契的第n项和第n+1项{fib[n],fib[n+1]},那么求它的下一项就是乘一个2*2的矩阵 {01} {10}然后就是矩阵快速幂做就好了 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int mod=1e4; #define ll long long void mul(int f[2],int a[2][2]) { int c[2]; memset(c,0,sizeof(c)); for(int j=0;j<2;j++) for(int k=0;k<2;k++) c[j]=(c[j]+(ll)f[k]*a[k][j])%mod; memcpy(f,c,sizeof(c)); } void mulself(int a[2][2]) { int c[2][2]; memset(c,0,sizeof(c)); for(int i=0;i<2;i++) for(int j=0;j<2;j++) for(int k=0;k<2;k++) c[i][j]=(c[i][j]+(ll)a[i][k]*a[k][j])

均值、方差、协方差、协方差矩阵、特征值、特征向量

家住魔仙堡 提交于 2019-11-28 06:54:54
均值: 描述的是样本集合的中间点。 方差: 描述的是样本集合的各个样本点到均值的距离之平均,一般是用来描述一维数据的。 协方差: 是一种用来度量两个随机变量关系的统计量。 只能处理二维问题。 计算协方差需要计算均值。 如下式: 方差与协方差的关系 方差是用来度量单个变量 “ 自身变异”大小的总体参数,方差越大表明该变量的变异越大 协方差是用来度量两个变量之间 “协同变异”大小的总体参数,即二个变量相互影响大小的参数,协方差的绝对值越大,则二个变量相互影响越大。 协方差矩阵: 协方差矩阵能处理多维问题; 协方差矩阵是一个对称的矩阵,而且对角线是各个维度上的方差。 协方差矩阵计算的是不同维度之间的协方差,而不是不同样本之间的。 样本矩阵中若每行是一个样本,则每列为一个维度,所以计算协方差时要 按列计算均值 。 如果数据是3维,那么协方差矩阵是: 特征值与 特征向量 线性变化: 线性变换 (线性映射)是在作用于 两个向量空间之间的函数 ,它保持 向量加法和标量乘法 的运算,从一个向量空间变化到另一个向量空间。 实际上线性变换表现出来的就是一个矩阵 。 特征值和特征向量 是一体的概念: 对于一个给定的线性变换(矩阵A),它的特征向量 ξ 经过这个线性变换之后,得到的新向量仍然与原来的 ξ 保持在同一條直線上,但其长度也许會改变。一个特征向量的长度在该线性变换下缩放的比例(λ)称为其特征值

二维坐标变换

雨燕双飞 提交于 2019-11-28 06:04:07
平时开发程序,免不了要对图像做各种变换处理。有的时候变换可能比较复杂,比如平移之后又旋转,旋转之后又平移,又缩放。 直接用公式计算,不但复杂,而且效率低下。这时可以借助变换矩阵和矩阵乘法,将多个变换合成一个。 最后只要用一个矩阵对每个点做一次处理就可以得到想要的结果。 另外,矩阵乘法一般有硬件支持,比如3D 图形加速卡,处理3D变换中的大量矩阵运算,比普通CPU 要快上1000倍。 下面是3类基本的2D图形变换。 平移: 设某点向x方向移动 dx, y方向移动 dy ,[x,y]为变换前坐标, [X,Y]为变换后坐标。 则 X = x+dx; Y = y+dy; 以矩阵表示: 1 0 0 [X, Y, 1] = [x, y, 1][ 0 1 0 ] ; dx dy 1 1 0 0 0 1 0 即平移变换矩阵。 dx dy 1 旋转: 旋转相比平移稍稍复杂: 设某点与原点连线和X轴夹角为b度,以原点为圆心,逆时针转过a度 , 原点与该点连线长度为R, [x,y]为变换前坐标, [X,Y]为变换后坐标。 x = Rcos(b) ; y = Rsin(b); X = Rcos(a+b) = Rcosacosb - Rsinasinb = xcosa - ysina; (合角公式) Y = Rsin(a+b) = Rsinacosb + Rcosasinb = xsina + ycosa

Python 数据科学-Numpy

谁说我不能喝 提交于 2019-11-28 04:50:48
NumPy Numpy :提供了一个在Python中做科学计算的基础库,重在数值计算,主要用于多维数组(矩阵)处理的库。用来存储和处理大型矩阵,比Python自身的嵌套列表结构要高效的多。本身是由C语言开发,是个很基础的扩展,Python其余的科学计算扩展大部分都是以此为基础。 高性能科学计算和数据分析的基础包 ndarray,多维数组(矩阵),具有矢量运算能力,快速、节省空间 矩阵运算,无需循环,可完成类似Matlab中的矢量运算 线性代数、随机数生成 使用以下语句导入 Numpy 库: import numpy as np NumPy 数组 创建数组 >>> a = np.array([1,2,3]) >>> b = np.array([(1.5,2,3), (4,5,6)], dtype = float) >>> c = np.array([[(1.5,2,3), (4,5,6)], [(3,2,1), (4,5,6)]], dtype = float) 初始化占位符 >>> np.zeros((3,4))# 创建值为0数组 >>> np.ones((2,3,4),dtype=np.int16)# 创建值为1数组 >>> d = np.arange(10,25,5)# 创建均匀间隔的数组(步进值) >>> np.linspace(0,2,9)# 创建均匀间隔的数组(样本数)

Unity Shader内置矩阵之美

≡放荡痞女 提交于 2019-11-28 00:47:59
mul函数 mul函数,Z = mul(M, V)是表示矩阵M和向量V进行点乘,得到一个向量Z,这个向量Z就是对向量V进行矩阵变换后得到的值。 特别需要注意的是,例如normal是float3类型的,点乘的矩阵也要转换成float3x3。 float3 normal=mul((float3x3)UNITY_MATRIX_IT_MV,v.normal); 矩阵 内置的矩阵(float4x4): 1、这里要特别说明一下UnityObjectToClipPos(v.vertex)) 方法,官方网站上说明,编写着色器脚本时,请始终使用UnityObjectToClipPos(v.vertex)而不是mul(UNITY_MATRIX_MVP,v.vertex),因为所有内建的矩阵名字在Instanced Shader中都是被重定义过的,如果直接使用UNITY_MATRIX_MVP,会引入一个额外的矩阵乘法运算,所以推荐使用UnityObjectToClipPos / UnityObjectToViewPos函数,它们会把这一次额外的矩阵乘法优化为向量-矩阵乘法。 2、UNITY_MATRIX_IT_MV的使用场景,专门针对法线进行变换。但是为什么法线的变换和顶点不一样呢? 之所以法线不能直接使用UNITY_MATRIX_MV进行变换,是因为法线是向量,具有方向,在进行空间变换的时候

glm初试,关于行矩阵列矩阵问题

ぃ、小莉子 提交于 2019-11-28 00:32:43
/*** * glm中矩阵是行优先存储的,这不同于opengl默认的以列优先存储的方式??,以下面矩阵mat为例 * 它是用四个行向量来模拟存储四个行:vec4 value[4],其中 * value[0] = (1,0,0,0) = (m[0][0],m[0][1],m[0][2],m[0][3]) * value[1] = (0,1,0,0) = (m[1][0],m[1][1],m[1][2],m[1][3]) * value[2] = (0,0,1,0) = (m[2][0],m[2][1],m[2][2],m[2][3]) * value[3] = (1,1,1,1) = (m[3][0],m[3][1],m[3][2],m[3][3]) * 这个存储与opengl从直观看是不一样的,它的平移部分存储到了第四行,而不是第四列,与DX的写法一致 */ glm::mat4 mat = mat4( 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1 ); glm::vec4 v(1, 2, 3, 1); /*** * 矩阵与向量向乘规则,遵守opengl的谁在前谁是列向量的规则 * 矩阵在前则矩阵看成是四个列向量,向量在后则为一个行向量 * 向量在前则向量看成一个列向量,矩阵在后则视为四个行向量 */ /*** * 【矩阵与向量相乘