如何在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中,确保将数据放置在正确的索引处。

示例代码中的内容不适合您的要求。如果我运行它,最终结果会被填充得很好,但会被截断为原始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矩阵。

相关内容

  • 没有找到相关文章

最新更新