【Matlab笔记_22】Matlab地图矩阵左右置换
有时候需要对矩阵进行左右置换,而非左右翻转,如地理经度数据重组,可以通过以下简单的代码实现
-
计算列数
numCols = size(A, 2);
获取输入矩阵
A
的列数,结果保存在numCols
变量中。 -
确定中间列索引
midCol = ceil(numCols / 2);
通过向上取整计算中间列的索引。例如:
- 若列数为5,
midCol = 3
(中间列是第3列)。 - 若列数为6,
midCol = 3
(将列分为前3列和后3列)。
- 若列数为5,
-
交换左右部分
A = [A(:, midCol+1:end, :), A(:, 1:midCol, :)];
将原矩阵从中间列分为左右两半,并交换位置:
- 右半部分:
midCol+1
到最后一列(A(:, midCol+1:end, :)
)。 - 左半部分:第1列到
midCol
列(A(:, 1:midCol, :)
)。 - 最终结果
A
是右半部分在前,左半部分在后的拼接矩阵。
- 右半部分:
举例
- 奇数列(如5列):
原列顺序[1, 2, 3, 4, 5]
→ 交换后为[4, 5, 1, 2, 3]
。 - 偶数列(如6列):
原列顺序[1, 2, 3, 4, 5, 6]
→ 交换后为[4, 5, 6, 1, 2, 3]
。
注意
该方法需要注意地图经纬是否为偶数,在一定程度上,偶数的置换才能确保0和360的经度能贴合,将 0°~360° 数据转换为 -180°~180° 格式时,偶数列确保中心对称。
简单的运行代码如下:
numCols = size(A, 2); % 获取输入矩阵列数
% 检查列数是否为偶数
if mod(numCols, 2) ~= 0
% 弹出对话框询问是否继续
answer = questdlg('当前矩阵列数为奇数,中间列将会被移动得到最后一列,是否继续执行交换?', ...
'列数奇偶性警告', ...
'继续', '取消', '取消'); % 默认选项为“取消”
% 根据用户选择决定是否终止程序
if strcmp(answer, '取消')
error('用户终止操作:列数必须为偶数以安全交换数据。');
end
end
a=1
% 执行列交换操作
midCol = ceil(numCols / 2);
A= [A(:, midCol+1:end, :), A(:, 1:midCol, :)];
为了方便代码简洁,可以将其封装非一个函数,需要的时候扔进去矩阵调用函数就可以
function A = SwapColumns(A)
% 函数功能:交换矩阵的左右半部分,处理奇数列情况
% 输入参数:
% A - 二维或三维矩阵(支持多通道数据,第三维度为通道)
% 输出参数:
% A - 处理后的矩阵,左右半部分已交换。奇数列时中间列移至末尾
% 编写日期:2025-3-22
% 作者:zhuzy
numCols = size(A, 2); % 获取矩阵列数
% 检查列数奇偶性
if mod(numCols, 2) ~= 0
% 弹窗提示中间列移动行为
answer = questdlg('当前矩阵列数为奇数,中间列将会被移动至最后一列,是否继续执行交换?',...
'列数奇偶性警告',...
'继续', '取消', '取消');
% 根据用户选择控制流程
if strcmp(answer, '取消')
error('用户终止操作:列数必须为偶数以安全交换数据。')
end
end
% 计算中间列并执行交换
midCol = ceil(numCols / 2);
A = [A(:, midCol+1:end, :), A(:, 1:midCol, :)];
end