我试图在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
矩阵。