如何在MATLAB 2019b中实现矩阵非循环列移位并补零?
解决MATLAB非循环列移位并补零的问题
嘿,我来帮你搞定这个非循环列移位的需求!其实完全不用写循环,MATLAB的矩阵索引就能高效实现你的需求,而且代码更简洁~
先理清楚你的核心需求:
- 当
channelSink > layerIV时,把所有列左移abs(diff)位,右侧空出来的列补零 - 当
channelSink < layerIV时,把所有列右移abs(diff)位,左侧空出来的列补零 - 两者相等时不做操作
下面是修改后的完整代码,替换你原来的for循环部分就行:
%dummy data data = rand(5, 16); channelSink = 9; layerIV = 7; diff = layerIV - channelSink; if channelSink > layerIV % 计算左移位数 shift_n = abs(diff); % 左移:取原矩阵第shift_n+1到末尾的列,右侧补shift_n个零列 data_shifted = [data(:, shift_n+1:end), zeros(size(data,1), shift_n)]; elseif channelSink < layerIV % 计算右移位数 shift_n = abs(diff); % 右移:左侧补shift_n个零列,再接原矩阵第1到end-shift_n的列 data_shifted = [zeros(size(data,1), shift_n), data(:, 1:end-shift_n)]; else % 无需移位,直接赋值原矩阵 data_shifted = data; disp('Sink at channel 7; not necessary to re-align'); end
代码解释:
- 左移操作:
data(:, shift_n+1:end)提取原矩阵从第shift_n+1列到最后一列的所有数据,然后用zeros(size(data,1), shift_n)生成和原矩阵行数相同、列数为shift_n的零矩阵,拼接到右侧就完成了左移补零。 - 右移操作:先生成
shift_n列的零矩阵拼接到左侧,再提取原矩阵前end-shift_n列的数据接在后面,实现右移左侧补零。 - 全程没有循环,利用MATLAB的向量化操作,比循环效率高得多,尤其是处理大矩阵的时候效果更明显。
你可以直接运行这段代码测试,dummy数据会生成符合要求的移位矩阵~
内容的提问来源于stack exchange,提问作者CinelliT
相关产品推荐
相关产品推荐

