7. 行向量
res = 8 ; % 一行一列, 8B, double
a = [ 5 88 3 11 ] ; % 一行四列, 32B, double
b = [ 3 : 1 : 9 ] ; % = [ 3 : 9 ] , 从3 开始,以1 为步长,直到9 结束, 3 4 5 6 7 8 9
c = [ 9 : - 1 : 3 ] ; % 从9 开始,以- 1 为步长,直到3 结束
d = linspace( 3 , 9 , 7 ) ; % 等差数列,3 开始,9 结束,7 个元素
e = logspace( 3 , 9 , 7 ) ; % 等比数列,从10 ^ 3 到10 ^ 9 , 7 个元素
f = [ a b] ; % a行向量和b行向量组合为新的行向量
a( 1 ) ; % 取出a行向量中的第一个元素,5
a( [ 2 4 ] ) ; % 取出a行向量中的第2 个元素和第4 个元素,88 11
a( end) ; % 返回a行向量中最后一个元素 11
a( 1 ) = 1 ; % 令a中第一个元素变为 1
a( 1 : 2 ) = [ 1 2 ] ; % 改变a中第1 到2 个元素的值
a( 6 ) = 6 ; % 不提倡用,增加a的第6 个元素值为6 , 5 88 3 11 0 6
a( b[ 2 , 1 ] ) ; % = a( [ 4 , 3 ] ) , 11 3
8. 列向量与矩阵
8.1 列向量
a = [ 3 ; 7 ; 4 ] ; % 一个列向量
b = [ 3 , 7 , 4 ] '; % ' 实数转置,行向量转置为列向量
c = [ 1 + 3i, 2 - 7i, 5 + 4i] . '; % .' 这是共轭复数转置
v_col = ( 3 : 9 ) '; % =[3:9]' , 3 4 5 6 7 8 9 的列向量
v_row = ( 3 : 9 ) ; % = [ 3 : 9 ] , 3 4 5 6 7 8 9 的行向量
v_col( [ 3 : 5 ] ) ; % 5 6 7 ,列向量中第3 行到第5 行元素
v_row( [ 3 : 5 ] ) ; % 5 6 7 , 行向量中第3 列到第4 列元素
v_col( [ 3 : 5 ] ') ; % 5 6 7 , 列向量中第3 行到第5 行元素, 与数组指标方向无关
8.2 矩阵
m = [ 9 , 6 , 3 ; 5 , 7 , 2 ] ; % 矩阵
rand( ) ; % 1 行1 列
rand( 2 ) ; % n维方阵,2 行2 列
rand( 2 , 3 ) ; % 两行三列矩阵
randi( [ 1 , 10 ] ) ; % 1 - 10 随机整数,1 行1 列
randi( [ 1 , 10 ] , 3 , 4 ) ; % 1 - 10 随机整数,3 行4 列
zeros( 3 ) ; % 3 行3 列,全是0
zeros( 3 , 4 ) ; % 3 行4 列,全是0
ones( 3 ) ; % 3 行3 列,全是1
ones( 3 , 4 ) ; % 3 行4 列,全是1
eye( 4 ) ; % 4 维单位方阵
v = [ 3 : 9 ] ;
diag( v) ; % 对角线元素为v的元素,其余为0 的方阵
diag( - 1 : - 1 : - 6 , - 1 ) ; % 主对角线标号为0 ,下三角主对角线下方元素为- 1 到- 6 ,其余元素为0 的方阵
diag( - 1 : - 1 : - 6 , - 1 ) + diag( v) ; % 对角线元素为v的元素, 主对角线下方元素为- 1 到- 6 ,其余元素为0 的方阵
% 返回矩阵元素
m( 2 , 3 ) ; % 返回m矩阵第2 行第3 列元素,2
m( 2 , [ 1 3 ] ) ; % 返回m矩阵第2 行的第1 ,3 列元素,5 2
m( 1 , 1 : 3 ) ; % 返回m矩阵第1 行的第1 列到第3 列元素,9 6 3
m( 1 , : ) ; % 返回m矩阵第1 行元素
m( : , 2 ) ; % 返回m矩阵第2 列元素
m( : , end) ; % 返回m矩阵最后一列元素,3 2
m( end- 1 , : ) ; % 返回m矩阵倒数第二行元素,9 6 3
% 线性下标
m( 2 ) ; % 第二行第一列元素,5
m( [ 1 2 3 4 5 6 ] ) ; % 9 5 6 7 3 2 ,矩阵的线性下标从第一列开始依次往下排列
% 改变矩阵值
m( 2 , 3 ) = NaN; % 改变第二行第三列元素值
m( 1 , : ) = [ 1 2 3 ] ; % 改变矩阵第一行元素值
m( 1 , : ) = [ 1 ; 2 ; 3 ] ; % = [ 1 2 3 ] , 改变第一行值,只要提供相同个数元素即可,一维
m( 1 : 2 , 1 : 2 ) = [ 7 , 8 ; 9 , 10 ] ; % 改变第1 行到第2 行,第1 列到第2 列元素
m( 1 : 2 , 1 : 2 ) = [ 7 , 8 , 9 , 10 ] ; % 错误,必须提供相同维数的元素,即不能用一维改变二维
m( 1 , : ) = 0.5 ; % 第一行元素赋值为0.5
m( 1 : 2 , 1 : 2 ) = 0.5 ; % 正确,右边为标量可以赋值,这是特例
length( m) ; % 返回矩阵行或列最大值
size( m) ; % 返回矩阵行和列大小
vector_size = size( m) ; % vector_size 为一行两列向量,[ 2 3 ]
[ n_row, n_col] = size( m) ; % 分别赋值,n_row = 2 , n_col= 3
numel( m) ; % 6 , 返回矩阵元素个数
zeros( size( m) ) ; % 2 行3 列的0 矩阵
0 * NaN; % NaN
% 0 - > { 1 , 1 / 2 , 1 / 4 , 1 / 8 , . . .1 / 2 ^ n}
% NaN - > { 1 , 2 ^ 2 , 1 , 2 ^ 3 , 1 , 2 ^ 4 , . . .1 , 2 ^ n, . . . }
% 0 * NaN - > { 1 * 1 , 2 ^ 2 / 2 , 1 / 4 , 1 , . . .1 / 2 ^ n, 1 , . . . }
9. 向量和矩阵的常用函数
m = randi( [ 1 , 9 ] , 3 , 4 ) ; % 3 行4 列矩阵
reshape( m, 2 , 6 ) ; % 生成2 行6 列的矩阵,必须确保与原矩阵m的元素个数相同,保留列的方式重新生成, 即从m的第一列开始依次赋值给新的第一列开始的元素
flipud( m) ; % 上下翻转 , 如:第1 行到最后一行,最后一行到第一行
fliplr( m) ; % 左右翻转,如:第1 列到最后一列,最后一列到第一列
flip( [ 1 3 5 ] ) ; % 按列翻转,[ 5 3 1 ] , 根据较大的维度翻转,
flip( [ 1 3 5 ] ') ; % 按行翻转,[ 5 3 1 ] ’, 根据较大的维度翻转
rot90( m) ; % 矩阵m逆时针旋转90 度
a = [ 1 2 ; 3 4 ] ;
repmat( a, 2 , 3 ) ; % 重复矩阵a,纵向2 个横向3 个
repelem( a, 2 , 3 ) ; % 把每一个元素用2 行3 列子阵代替,重复a的每一个元素
e = [ ] ; % 建立一个空矩阵
size( e) ; % [ 0 0 ]
[ e a] ; % [ 1 2 ; 3 4 ]
e = [ e, randi( [ 1 , 6 ] ) ] ;
% 三维矩阵
T( : , : , 1 ) = m; % 第一个: 代表访问T的所有行,第二个: 代表访问T的所有列,第三个1 代表访问T的第1 页,整体代表访问T的第1 页
T( : , : , 2 ) = randi( [ 1 , 9 ] , 3 , 4 ) ; %
T( : , : , 3 ) = randi( [ 1 , 9 ] , 3 , 4 ) ; %
size( T) ; % [ 3 4 3 ]
numel( T) ; % 48
abs ( - 5 ) ; % 5
v = randi( [ - 5 , 5 ] , [ 1 , 4 ] ) ; % v = [ - 5 1 5 - 3 ] ,一维
abs ( v) ; % [ 5 1 5 3 ]
sign( v) ; % [ - 1 1 1 - 1 ]
min ( v) ; % - 5 , 返回数组中元素最小值
max ( v) ; % 5 ,返回数组中元素最大值
sum ( v) ; % 返回数组中所有元素的和
prod( v) ; % - 5 * 1 * 5 * - 3 ,回数组中所有元素的乘积
cumsum( v) ; % [ - 5 - 4 1 - 2 ] , 依次扩大求和范围,即[ - 5 , - 5 + 1 , - 5 + 1 + 5 , - 5 + 1 + 5 - 3 ]
cumprod( v) ; % 分别扩大乘积范围
cummin( v) ; % 依次计算最小值
cummax( v) ; % 依次计算最大值
m = [ 1 2 ; 3 4 ] ; % 二维
min ( m) ; % [ 1 3 ] , 对每一列进行min , 结果存为行向量
10. 向量运算与矩阵运算
10.1 向量运算
diff( [ 1 4 7 8 3 ] ) ; % [ 3 3 1 - 5 } ,相邻元素做差, 即第i+ 1 个元素- 第i个元素
[ 1 4 7 8 3 ] * 3 ; % [ 3 12 21 24 9 ]
[ 1 4 7 8 3 ] + 1 ; % [ 2 5 8 9 4 ]
10.2 矩阵与矩阵间的运算
a = [ 1 2 ] ;
b = [ 3 4 ] ;
a + b ; % [ 4 6 ]
a - b ; % [ - 2 , - 2 ]
a * b; % 错误
a . * b; % [ 3 , 8 ] , 矩阵对应元素间运算
a . / b; % [ 1 / 3 , 2 / 4 ]
a . ^ b; % [ 1 ^ 3 , 2 ^ 4 ]
11. 逻辑向量与逻辑矩阵
v = rand( 1 , 5 ) ; % 0.8147 0.9058 0.1270 0.9134 0.6324
u = v > 0.5 ; % 1 1 0 1 1
v( u) ; % 0.8147 0.9058 0.9134 0.6324 , 只返回logical为1 的元素
v( v> 0.5 ) ; % 0.8147 0.9058 0.9134 0.6324
vec = [ 5 9 3 4 6 11 ] ;
v = [ 0 1 0 0 1 1 ] ;
vec( v) ; % 报错,因为v中元素不是逻辑类型
v = logical( [ 0 1 0 0 1 1 ] ) ; % 将v中元素转为逻辑类型
vec( v) ; % 9 6 11
log_true = ones( 3 , 4 , 'logical' ) ; % 返回一个3 行4 列的逻辑矩阵,均为1
any ( v) ; % v是一维行向量,返回logical, 1 , v是逻辑数组,any 判断v里是否至少有一个真值
all ( v) ; % logical, 0 , 判断v里是否全为真值
R = rand( 50 , 50 ) ;
any ( R< 0.001 ) ; % R< 0.001 是一个50 * 50 的矩阵,当参数是矩阵时,返回矩阵中每一列对应的值
v = rand( 1 , 5 ) ; % 0.8147 0.9058 0.1270 0.9134 0.6324
u = v > 0.5 ; % 1 1 0 1 1
find( v) ; % v为逻辑数组,会返回v中真值的位置, 1 2 4 5
min ( find( v) ) ; % 1
find( v, 1 , 'first' ) ; % 找第一个为逻辑真的位置,1
find( v, 2 , 'first' ) ; % 找前两个为逻辑真的位置, 1 2
v1 = [ 1 2 3 4 ] ;
v2 = [ 1 2 3 4 ] ;
v1 == v2; % 1 1 1 1
all ( v1 == v2) ; % logical, 1 , == : 数组的行和列数必须相同
isequal( v1, v2) ; % logical, 1 , 比较两个数组,行和列数必须相同可以不同
sum ( v1 == 1 & v2 == 2 ) ; % 2 , 逻辑数组要用&
sum ( v1 == 1 & & v2 == 2 ) ; % 错误
12. 矩阵乘法
12.1 矩阵乘法
m1 = randi( [ 1 , 9 ] , [ 3 , 4 ] ) ; % 1 - 9 , 3 行4 列
m2 = randi( [ 1 , 9 ] , [ 4 , 3 ] ) ; % 1 - 9 , 4 行3 列
m1* m2; % 3 行3 列
m1^ 2 ; % m1 * m1
12.2 向量相乘
v1 = randi( [ 1 , 9 ] , [ 1 , 3 ] ) ; % 9 2 8
v2 = randi( [ 1 , 9 ] , [ 1 , 3 ] ) ; % 7 3 5
v1 . * v2; % 63 6 40 , 内积
cross( v1, v2) ; % - 14 11 13 , 矩阵叉乘
12.3 常用矩阵
hilb( 3 ) ; %
pascal( 3 ) ;
magic( 4 ) ;
ind2sub( size( m) , find( m == 1 ) ) ; % 线性下标转为行标和列标