如何在MATLAB中缩放表示函数值的二维矩阵得到f(x/s,y/s)?
MATLAB矩阵按整数因子缩放实现方案
首先明确原矩阵与缩放后矩阵的尺寸关系:要得到包含f(x/s, y/s)的矩阵M2,相当于将原函数的坐标分辨率提升s倍,因此M2的行数为原矩阵行数×s,列数为原矩阵列数×s。
一、不需要插值(允许补0)的实现
直接将原矩阵的每个元素映射到缩放后矩阵的对应间隔位置,其余位置填充0即可,代码如下:
originalMatrix = magic(10); s = 2; % 整数缩放因子 [rows, cols] = size(originalMatrix); % 初始化全0的缩放矩阵,尺寸为原矩阵的s倍 scaledMatrix = zeros(rows*s, cols*s); % 将原矩阵元素放到缩放矩阵的s间隔位置(对应f(x/s,y/s)的整数坐标点) scaledMatrix(1:s:end, 1:s:end) = originalMatrix;
代码说明:1:s:end会选取缩放矩阵中第1、1+s、1+2s…的行和列,刚好对应原矩阵每个元素的映射位置,其余未赋值的位置保持0。
二、需要插值的实现
若要对非整数坐标的位置填充插值结果,可使用MATLAB内置的interp2函数,支持多种插值方法:
'nearest':最近邻插值'linear':线性插值(默认)'cubic':三次插值'spline':样条插值
示例代码(以线性插值为例):
originalMatrix = magic(10); s = 2; [rows, cols] = size(originalMatrix); % 生成原矩阵的坐标网格 [xOrig, yOrig] = meshgrid(1:cols, 1:rows); % 生成缩放后的目标坐标网格,步长为1/s,保证分辨率提升s倍 [xScaled, yScaled] = meshgrid(1:1/s:cols, 1:1/s:rows); % 执行插值,替换方法参数即可切换插值类型 scaledMatrix = interp2(xOrig, yOrig, originalMatrix, xScaled, yScaled, 'linear');
三、MATLAB内置缩放方法
除了手动实现,还可以使用imresize函数(原本用于图像处理,但适配一般矩阵),直接指定缩放因子和插值方法:
originalMatrix = magic(10); s = 2; % 放大s倍,使用线性插值 scaledMatrix = imresize(originalMatrix, s, 'linear'); % 若用最近邻插值: % scaledMatrix = imresize(originalMatrix, s, 'nearest');
注:imresize的缩放因子大于1时为放大,小于1时为缩小,输出矩阵尺寸会自动匹配缩放比例。
内容的提问来源于stack exchange,提问作者requiemman
相关产品推荐
相关产品推荐

