1.名词:矩阵,张量,转置,主对角线,广播
2.矩阵和向量相加–>广播
eg:
##广播 矩阵加向量
import numpy as np
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
c=[1,2,3]
print(a)
b= a+100
print(b)
d=a+c
print(d)
e =a/c
print(e)
输出结果:
runfile('C:/Users/Administrator/.spyder-py3/temp.py', wdir='C:/Users/Administrator/.spyder-py3')
[[1 2 3]
[4 5 6]
[7 8 9]]
[[101 102 103]
[104 105 106]
[107 108 109]]
[[ 2 4 6]
[ 5 7 9]
[ 8 10 12]]
[[1. 1. 1. ]
[4. 2.5 2. ]
[7. 4. 3. ]]
3.矩阵的标准乘积与两个矩阵对应元素的乘积(hadamard乘积)
hadamard矩阵的基本构成可以用下面的矩阵来描述
Hadamard矩阵是由+1和-1元素构成的正交方阵。
如果:AAT=E(E为单位矩阵,AT表示“矩阵A的转置矩阵”。)或ATA=E,则n阶实矩阵A称为正交矩阵,若A为正交阵,则满足以下条件 [2] [3] :
1)AT是正交矩阵
2)(E为单位矩阵)
3)A的各行是单位向量且两两正交
4)A的各列是单位向量且两两正交
5)(Ax,Ay)=(x,y)x,y∈R
6)|A|=1或-1
7)
8)正交矩阵通常用字母Q表示。
hadamard矩阵的一个典型应用是用于模板匹配。而SATD匹配算法则主要用到hadamard矩阵
https://blog.youkuaiyun.com/Aoulun/article/details/80433638
http://fourier.eng.hmc.edu/e161/lectures/wht/node1.html
# -*- coding: utf-8 -*-
"""
Created on Thu Jul 26 14:22:40 2018
@author: Administrator
"""
import numpy as np
a = np.array([[1,2],[3,4],[11,12]])
b = np.array([[5,6,13],[7,8,14]])
c = np.array([[1,2,13],[3,4,25],[11,12,23]])
d = np.array([[5,6,2],[7,8,29],[13,14,15]])
matrix_a = np.matrix(a) # (3,2)
matrix_b = np.matrix(b) # (2,3)
matrix_c = np.matrix(c) # (3,3)
matrix_d = np.matrix(d) # (3,3)
print(type(a),type(matrix_a)) # <class 'numpy.ndarray'> <class 'numpy.matrixlib.defmatrix.matrix'>
mat_a = np.mat(a)
print(type(a),type(matrix_a)) # <class 'numpy.ndarray'> <class 'numpy.matrixlib.defmatrix.matrix'>
'''
# 1) matrix multiplication
矩阵乘法: (m,n) x (n,p) --> (m,p) # 矩阵乘法运算前提:矩阵1的列=矩阵2的行
3种用法: np.dot(matrix_a, matrix_b) == matrix_a @ matrix_b == matrix_a * matrix_b
'''
method_1 = matrix_a @ matrix_b
method_2 = np.dot(matrix_a, matrix_b)
print(method_1)
#[[ 19 22 41]
# [ 43 50 95]
# [139 162 311]]
print(method_2 == method_1)
#[[ True True True]
# [ True True True]
# [ True True True]]
print(matrix_c * matrix_d == matrix_c @ matrix_d)
#[[ True True True]
# [ True True True]
# [ True True True]]
'''
# 2) element-wise product : 矩阵对应元素相乘
1种用法:np.multiply(matrix_c, matrix_d)
对于nd.array()类型而言,数组 arrA * arrB 只能element-wise produt(对应元素相乘)
'''
print(matrix_c, matrix_d, sep='\n')
#[[ 1 2 13]
# [ 3 4 25]
# [11 12 23]]
#[[ 5 6 2]
# [ 7 8 29]
# [13 14 15]]
method_1 = np.multiply(matrix_c, matrix_d) # 对应位置元素相乘
method_2 = c*d;
print(method_1)
#[[ 5 12 26]
# [ 21 32 725]
# [143 168 345]]
print(method_2)
print(method_2 == method_1)
实验结果:
runfile('C:/Users/Administrator/.spyder-py3/temp.py', wdir='C:/Users/Administrator/.spyder-py3')
<class 'numpy.ndarray'> <class 'numpy.matrixlib.defmatrix.matrix'>
<class 'numpy.ndarray'> <class 'numpy.matrixlib.defmatrix.matrix'>
[[ 19 22 41]
[ 43 50 95]
[139 162 311]]
[[ True True True]
[ True True True]
[ True True True]]
[[ True True True]
[ True True True]
[ True True True]]
[[ 1 2 13]
[ 3 4 25]
[11 12 23]]
[[ 5 6 2]
[ 7 8 29]
[13 14 15]]
[[ 5 12 26]
[ 21 32 725]
[143 168 345]]
[[ 5 12 26]
[ 21 32 725]
[143 168 345]]
[[ True True True]
[ True True True]
[ True True True]]
4.单位矩阵:所有沿主对角线的元素都是1,其他都是0