MATLAB数组函数对整块数组一次完成尺寸查询、排序、翻转、变形、生成坐标等操作,用来代替逐元素循环。数据变大时,这套写法更省事,也是向量化编程的基础。

尺寸:size、length、numel、ndims

A = rand(3, 4);
size(A)    % [3 4]
length(A)  % 4,最长那一维
numel(A)   % 12
ndims(A)   % 2

对向量,lengthnumel 通常都是元素个数。size(v) 返回 [1 n][n 1],能看出行向量还是列向量。

排序:sort、sortrows

v = [23 45 12 9 5 0 19 17];
sort(v)
sort(v, 'descend')

对矩阵,sort 默认按列各自排序。第二个参数写成 2 则按行排:

m = [2 6 4; 5 3 9; 2 0 1];
sort(m)
sort(m, 2)

要按某一列把整行一起重排(例如按成绩排学生),用 sortrows

students = [78 92; 63 70; 90 81];
sortrows(students, 2)

翻转与旋转

A = [1 2 3; 4 5 6];
fliplr(A)   % 左右翻转
flipud(A)   % 上下翻转
rot90(A)    % 逆时针转 90 度

reshape

元素总数不变,只改行列排布。填充顺序是按列优先:先填满第一列,再填第二列:

A = 1:12;
B = reshape(A, 3, 4)
B =
     1     4     7    10
     2     5     8    11
     3     6     9    12

linspace 与 logspace

冒号适合指定步长。只知道要取几个点时,用 linspace

x = linspace(0, 1, 5)
y = linspace(0, 2*pi, 100)
x =
         0    0.2500    0.5000    0.7500    1.0000

logspace(0,3,4) 在 10^0 到 10^3 之间按对数取点,画对数坐标时常用。

circshift

a = [1 2 3; 4 5 6; 7 8 9];
circshift(a, 1)
circshift(a, [1 -1])

移位是循环的:从一头挤出的元素绕回另一头。信号处理、图像里会用到。

注意点

  • summeansort 等默认多沿第 1 维(对二维矩阵通常是列)工作,按行要显式写维度参数。
  • reshape 按列填,和按行填的直觉可能相反,不确定时先对小数组成验。
  • length 取的是最长维,不是行数的同义词,矩阵上别和 size 混用。