如何在Matlab中非循环移位

How to shift non circularly in Matlab

我正在尝试在 MATLAB 中进行非循环移位,因此即使我在索引之外进行移位,它也会添加 0 来更正它。我尝试按照 中的答案进行操作,但没有成功。

data = [1 2 3 4 5; 11 12 13 14 15; 21 22 23 24 25; 31 32 33 34 35]
d = 3; % shift; positive/negative for right/left
result = zeros(size(data), 'like', data); % preallocate with zeros
result(:,max(1,1+d):min(end,end+d)) = data(:,max(1,1-d):min(end,end-d)); % write values

在我的输出结果中,大小相同但全为零

期望的输出:

 0     0     0     1     2    3      4      5  
 0     0     0     11    12   13     14     15 
 0     0     0     21    22   23     24     25
 0     0     0     31    32   33     34     35

您可以创建一个矩阵 result,最终大小,用零填充,然后将原始 data 复制到最终 result,确保将正确索引处的数据。

您的示例代码中的内容不符合您的要求。如果我 运行 它,最终结果被填充得很好,但 t运行 以原始 data 矩阵的大小。这就是一些矩阵的移动方式(移动的列完全删除),但这不是你问的。

一个简单的方法是创建一个适当大小的填充矩阵,然后简单地将它与原始 data 矩阵连接起来。这可以按如下方式完成:

%% Initial data
data = [1 2 3 4 5; 11 12 13 14 15; 21 22 23 24 25; 31 32 33 34 35] ;
d = 3 ;

%% shift and pad with zeros
nrows   = size(data,1) ;            % Number of rows in [data]
pad     = zeros( nrows , abs(d) ) ; % create padding matrix
if d>0
    result = [pad data] ; % Concatenate the filler matrix on the left
else
    result = [data pad] ; % Concatenate the filler matrix on the right
end

为了确定:

>> result
result =
     0     0     0     1     2     3     4     5
     0     0     0    11    12    13    14    15
     0     0     0    21    22    23    24    25
     0     0     0    31    32    33    34    35

如果您想以与示例代码相同的方式重用,则必须稍微调整一下以允许新列:

%% create result and copy data
result = zeros( size(data,1) , size(data,2)+abs(d) ) ;
colStart = max(1,1+d) ;
result(:,colStart:colStart+size(data,2)-1) = data ;

这将创建与上面相同的 result 矩阵。