矩阵乘法

shader入门精要读书笔记06 数学基础

倖福魔咒の 提交于 2020-01-30 14:50:39
第四章 数学基础 一、坐标系 笛卡尔坐标系,分为二维三维。 二维坐标系 OpenGL是左下角为0,DirectX是左上角。 三维坐标系,3个坐标轴也被称为基矢量,长度为1的基矢量叫做标准正交基,长度不唯1的叫正交基。 三维笛卡尔坐标系又分为左手坐标系与右手坐标系。 Unity使用的是左手坐标系,摄像头的观察空间是右手坐标系(摄像头前方为z轴的负方向)。 二、点和矢量 矢量:有方向有模,没有位置。 点:只是一个位置。 矢量的加减乘除运算,模运算。 单位矢量:被归一化的矢量。通过在矢量上方加个^来表示是矢量的模。 单位矢量的运算:通过矢量除以矢量的模来进行计算。 单位矢量计算通常使用在法线方向、光源方向等。 矢量的点积(内积/点乘): 点积就是可以确定两个矢量的方向关系。投影长度=标量。 点乘结果>0 :两个矢量方向关系为<90°。(=0 : 垂直,<0 : >90°) 求适量的模可以将矢量对其自身进行点乘,运算后开方。 a·b=|a||b|cos夹角 矢量的叉积(外积/叉乘): 叉积结果是矢量,不满足交换律,叉积的结果是得到一个同时垂直于这两个矢量的新矢量。 使用左手定则,右手定则来判断在不同坐标系中,新得到的矢量方向。 |a×b|=|a||b|sin夹角 我们可以通过点乘(cos值)来确定某两个矢量的夹角关系。 还可以通过叉乘判断一个面的正面反面(通过确定面上的三个点的顺时针

[Python] numpy

耗尽温柔 提交于 2020-01-30 00:06:36
numpy中array的特性: https://www.jianshu.com/p/a75e522d5839# https://blog.csdn.net/zenghaitao0128/article/details/78300770 相关操作: #两个元素的向量 a = np.array([1,2]) #1X2矩阵 a1 = np.array([[1,2]]) #2X1矩阵 a2 = np.array([[1],[2]]) #三个元素的向量 b = np.array([1,2,3]) #1X3矩阵 b1 = np.array([[1,2,3]]) #3X1矩阵 b2 = np.array([[1],[2],[3]]) #3X2矩阵 c = np.array([[1,1],[1,2],[1,3]]) #2X2矩阵,不同维矩阵相加,先扩维 print(a1+a2) #1X2矩阵,向量加矩阵,扩为行矩阵 print(a+a1) #2X2矩阵,向量转为行矩阵,然后矩阵扩维 print(a+a2) #报错,向量元素个数不相等 print(a+b) #三个元素的向量,矩阵乘向量 print(np.dot(c,a)) #报错,不符合矩阵乘法定义 print(np.dot(c,a1)) #3X1矩阵,矩阵乘法 print(np.dot(c,a2)) 矩阵乘法按定义,矩阵加法会扩维

朝花夕拾之Matlab矩阵运算

不羁岁月 提交于 2020-01-29 15:21:44
矩阵运算 1. 加、减运算 运算符:“+”和“-”分别为加、减运算符。 运算规则:对应元素相加、减,即按线性代数中矩阵的“十”,“一”运算进行。 例1-22 >>A=[1, 1, 1; 1, 2, 3; 1, 3, 6] >>B=[8, 1, 6; 3, 5, 7; 4, 9, 2] >>A+B=A+B >>A-B=A-B 结果显示:A+B= 9 2 7 4 7 10 5 12 8 A-B= -7 0 -5 -2 -3 -4 -3 -6 4 2. 乘法 运算符:* 运算规则:按线性代数中矩阵乘法运算进行,即放在前面的矩阵的各行元素,分别与放在后面的矩阵的各列元素对应相乘并相加。 1.两个矩阵相乘 例1-23 >>X= [2 3 4 5; 1 2 2 1]; >>Y=[0 1 1; 1 1 0; 0 0 1; 1 0 0]; Z=X*Y 结果显示为: Z= 8 5 6 3 3 3 2.矩阵的数乘:数乘矩阵 上例中:a=2*X 则显示:a = 4 6 8 10 2 4 4 2 向量的点乘(内积):维数相同的两个向量的点乘。 数组乘法: A.*B表示A与B对应元素相乘。 3 .向量点积 函数 dot 格式 C = dot(A,B) %若A、B为向量,则返回向量A与B的点积,A与B长度相同;若为矩阵,则A与B有相同的维数。 C = dot(A,B,dim) %在dim维数中给出A与B的点积

转:奇异值分解与特征值分解

偶尔善良 提交于 2020-01-29 04:31:44
文章摘自: http://blog.jobbole.com/88208/ 一、奇异值与特征值基础知识: 特征值分解和奇异值分解在机器学习领域都是属于满地可见的方法。两者有着很紧密的关系,我在接下来会谈到,特征值分解和奇异值分解的目的都是一样,就是提取出一个矩阵最重要的特征。先谈谈特征值分解吧: 1) 特征值: 如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式: 这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式: 其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值。我这里引用了一些参考文献中的内容来说明一下。首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的一个矩阵: 它其实对应的线性变换是下面的形式: 因为这个矩阵M乘以一个向量(x,y)的结果是: 上面的矩阵是对称的,所以这个变换是一个对x,y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值>1时,是拉长,当值<1时时缩短),当矩阵不是对称的时候,假如说矩阵是下面的样子: 它所描述的变换是下面的样子: 这其实是在平面上对一个轴进行的拉伸变换(如蓝色的箭头所示),在图中,蓝色的箭头是一个最 主要的

Numpy基础教程

不打扰是莪最后的温柔 提交于 2020-01-28 23:47:19
Numpy基础教程 目录 基本概念 numpy中的array创建 numpy中的array形状,纬度,大小 numpy中的array加减法,次方,三角函数,乘法 numpy中的最大小值,求和,平均值,中位数 numpy中值对应的索引 numpy中的累和,累差 numpy中判断非零元素 numpy中Transpose numpy中np.clip 大小阈值 numpy中索引对应的值 numpy中的迭代 numpy中的数组矩阵合并 numpy中的数组矩阵分割 numpy中的赋值和deepcopy 基本概念 : 数组:具有相同类型的数据组成的序列,且该序列是有序集合。 数组中的每一个数据称为数据元素。 数组元素由其所在的位置序号来区分。 一维数组是向量,二维数组是矩阵,三维数组......... 首先需要导入: import numpy as np numpy中的array创建 : # 创建一维数组 array_1 = np . array ( [ 1 , 2 , 3 ] ) # 创建二维数组(多维数组也同理) array_2 = np . array ( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] ] ) # 可以放在同一排,也可以对齐 # 生成全零的形状为[2,3]的数组,用括号也可以(2,3) o = np . zeros ( [ 2 , 3 ] ) #

Transformer模型学习笔记

痞子三分冷 提交于 2020-01-28 03:47:29
Transformer模型学习笔记 前言 回顾 参考资料 解读 1. High-level的看一下,transformer大致是个什么样子 2.详细看下, 具体结构,以及输入都长什么样 3.self-attention层 4.多头机制 Multi-head 5.输入语句中词的顺序(Positional Encoding) 6.剩余东西 7.解码器(Decoder) 8.最后输出层 前言 Google研究菌曰: 在transformer模型之前,我们做机器翻译等事情(论文原话: 我们做转录模型(transduction model)) 都是用循环神经网络(RNN)或者卷积神经网络(CNN)作为基本单元,搭建一个包含encoder和decoder的模型. 虽然效果不错,但是显然还有很多进步空间. 既然拿那么多钱,上班又不是996,不如整点新的东西? 于是有了transformer模型. 回顾 回顾下整体流程, 为啥会想到要去创造transformer这个东西. 做机器翻译? –>那咱们搭一个具有encoder-decoder结构的模型. 其中seq2seq是最常用的encoder-decoder模型–>模型里的小单元用基本结构的RNN或者基本结构的CNN. 训练完发现对长句记忆效果不理想,模型记不住之前的信息?发生梯度消失? –>采用RNN的变体结构LSTM 翻译效果不太好

矩阵链乘法

孤街浪徒 提交于 2020-01-27 18:54:42
#include <iostream> #include <cstring> #include <algorithm> using namespace std; #define N 100 #define INF 1000000 int p[N + 1], m[N + 1][N + 1]; void matrixchain(int n) { memset(m, 0, sizeof(m)); for (int r = 1; r <= (n - 1); r++) { for (int i = 1; i <= n; i++) { int j = i + r; m[i][j] = INF; for (int k = i; k < j; k++) { m[i][j] = min(m[i][j], m[i][k] + m[k + 1][j] + p[i] * p[k + 1] * p[j + 1]); } } } } int main() { int n; cin >> n; for (int i = 1; i <= n + 1; i++) { cin >> p[i]; } matrixchain(n); cout << m[1][n] << endl; return 0; } 来源: CSDN 作者: Just Go For It Now 链接: https://blog.csdn.net

NumPy矩阵运算

落爺英雄遲暮 提交于 2020-01-27 04:35:21
矩阵初始化 import numpy as np m = np . zeros ( [ 3 , 5 ] ) # print ( m ) n = np . ones ( [ 3 , 5 ] ) print ( n ) 生成3X5的矩阵值为0,1; #生成随机数矩阵 mn = np . random . rand ( 3 , 5 ) #3行4列的0-1之间的随机数矩阵 print ( mn ) #单位矩阵 z=np.eye(4)#4行4列一条对角线为1的单位矩阵 print (z) 2,矩阵的元素运算 / 矩阵相加相减的条件 必须矩阵大小相等 eg: import numpy as np z = np . eye ( 4 ) #这是一个对角线为1的矩阵 print ( z ) n = np . ones ( [ 4 , 4 ] ) print (n) print ( z + n ) 矩阵数乘:一个数乘以整个矩阵 import numpy as np z = np . mat ( [ [ 1 , 2 , 3 ] , [ 4 , 5 , 6 ] , [ 7 , 8 , 9 ] ] ) z = 10 * z print ( z ) 矩阵所有元素求和 #这里区别sum(),和np.sum();sum()返回的是每一列的和组成的裂变,np.sum()返回矩阵和 import numpy as

快速幂与矩阵快速幂

拥有回忆 提交于 2020-01-26 22:58:35
幂运算 幂运算 \(a^b\) 是 \(b\) 个 \(a\) 相乘的结果. C++自带的幂函数 pow 是最朴素的 \(O(b)\) 算法,效率非常低,所以如果要用到大量幂运算,最好自己打一个快速幂. 快速幂 求 \(a^b\%p\) 的值. 当 \(b=1\) 时,返回 \(a%p\) . 当 \(2\mid b\) 时,返回 \(pow(a,\frac{b}{2},p)^2%p\) . 当 \(2\nmid b\) 时,返回 \(pow(a,\frac{b}{2},p)^2%p*a%p\) . 时间复杂度为 \(O(\log{b})\) . long long poww(long long a,long long b,long long p) { if(b==1) return a%p; long long t=1; t=poww(a,b/2,p); t=t*t%p; if(b%2) t=t*a%p; return t; } 矩阵乘法 运算方法 矩阵加法,减法,矩阵乘常数这三种运算都很简单,这里不赘述. 有两个分别为 \(n\times m\) , \(m\times p\) 的矩阵 \(a,b\) 相乘,结果是一个 \(n\times p\) 的矩阵 \(c\) . \(c[i][j]=\sum\limits_{k=1}^{m}{a[i][k]*b[k][j]}\) .

BZOJ 2738. 矩阵乘法

一笑奈何 提交于 2020-01-26 15:08:28
整体二分加上一个二维树状数组数点即可。 #include <bits/stdc++.h> namespace IO { char buf[1 << 21], *p1 = buf, *p2 = buf; int p, p3 = -1; void read() {} inline int getc() { return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++; } template <typename T, typename... T2> inline void read(T &x, T2 &... oth) { T f = 1; x = 0; char ch = getc(); while (!isdigit(ch)) { if (ch == '-') f = -1; ch = getc(); } while (isdigit(ch)) { x = x * 10 + ch - 48; ch = getc(); } x *= f; read(oth...); } } const int N = 507; const int M = 500 * 500 + 6e4 + 7; int w[M], n, Q; struct Bit { int tree[N][N