做信号处理的兄弟,肯定被 MATLAB 矩阵移位 坑过。前两天处理一个 7 通道的传感器数据,想把它排成犬牙交错的样子,结果 circshift用不对,数据全乱了。2026年了,别再只会用 reshape硬怼了,circshift和 squeeze才是处理高维数据和错位排列的神器。今天聊聊怎么用这两个函数优雅地解决那些恼人的维度问题。
circshift的核心逻辑是循环,不是平移。它把数组的末尾接到开头。
% 向量移位
A = 1:10;
B = circshift(A, 3);
% 结果:8 9 10 1 2 3 4 5 6 7
看清楚了吗?向右移 3 位,前面空出来的位置不是补零,而是由末尾的元素补上。这是和 shift类函数最大的区别。
指定维度移位更常用。比如一个矩阵,只想移动行,不动列:M = [1 2 3; 4 5 6; 7 8 9];
M_shifted = circshift(M, 1, 1); % 第二个参数1表示移动1行,第三个参数1表示沿行维度
% 结果:
% 7 8 9
% 1 2 3
% 4 5 6
这招在做时间序列的滑动窗口或者数据增强时,简直不要太好用。文章里提到的那个案例很有意思:把 [1 2 3 4 5 6 7]变成 [1 5 2 6 3 7 4]。

代码是这样的:
n = 7;
a = 1:n;
for i = 1:n
a = circshift(a, [0, -1]); % 每次向左移动1位
end
关键点来了:为什么长度必须是奇数(7)?如果是偶数(8)呢?偶数:循环移位后,会出现对称性重复。比如 8 个元素,移位后会变成 5 0 6 0 7 0 8 0,出现了讨厌的 0 占位。 n = 8;
a = reshape(1:n, 2, n/2)'; % 变成2列
% 结果:
% 1 5
% 2 6
% 3 7
% 4 8
a = a'; % 转置
a = a(:)'; % 拉成向量
% 结果:1 2 3 4 5 6 7 8 (这是列优先拉直,如果想要行优先,调整reshape顺序)
别死磕 circshift了,有时候 reshape才是正解。squeeze解决的是维度冗余问题。这在读取 .mat文件或处理 3D 数据时太常见了。
% 创建一个 2x1x3 的矩阵(中间那个1就是 singleton dimension)
y = rand(2, 1, 3);
size(y) % 结果是 [2 1 3]
% 用 squeeze 压扁它
z = squeeze(y);
size(z) % 结果是 [2 3]
为什么要这么做?因为很多函数(比如 plot)不接受 [2, 1, 3]这种形状的输入。如果不 squeeze,画图会报错,或者画出三条奇怪的线。
实战场景:你用 imread读了一张灰度图,尺寸是 512x512x1。想把它存进数据库,那个 x1维度完全是多余的,用 squeeze去掉它,数据干净利落。
MATLAB 的矩阵操作讲究的是维度直觉。2026年,数据维度越来越高(时空数据、多通道信号),掌握好 circshift的循环特性和 squeeze的降维打击,你才能在数据的海洋里游刃有余。别让这些小函数,成了你算法路上的绊脚石。武汉格发信息技术有限公司,格发许可优化管理系统可以帮你评估贵公司软件许可的真实需求,再低成本合规性管理软件许可,帮助贵司提高软件投资回报率,为软件采购、使用提供科学决策依据。支持的软件有: CAD,CAE,PDM,PLM,Catia,Ugnx, AutoCAD, Pro/E, Solidworks 等。