【问题标题】:Reshape matrix with zeros padding用零填充重塑矩阵
【发布时间】:2014-11-15 06:19:45
【问题描述】:

我正在使用 reshape 函数处理矩阵。我有一个矩阵大小990 x 8。首先,我将其重塑为A x 400,其中 A 将被确定为 s.t 990x8 可被 400 去除。因此,我们必须添加 80 个零作为填充。所以,A是

 (990+10)/400=200

我的新矩阵是20 x 400。现在我在 A 中将一行设置为错误行。第二步,我想用该行错误恢复我的原始矩阵大小 990 x 8。所以,数字行错误将是

400/8=50 rows 

看下图就很清楚了。现在我想通过matlab代码来实现这个方案。让我们看看我的实现如下。但是,它与我的目标不同。它在单个行中出现了一些 -1(例如:[0 0 -1 0 0 ..],真正的答案必须是 [0 0 0...] 或 [-1 -1 -1..] 因为如果没有行error 将仅包含 0 或 1,并且错误行仅包含 -1 值)。请修复帮助我

    bitstream = reshape( orignalPacket.', [],1); %size 990 x 8
    %% Add padding        
    bitstream(end+80)=0; % add zeros padding at the end
    %% New matrix 20 x 400
    newmatrix= reshape( bitstream.', [],psize);
    %% Add one error row
    newmatrix(5,:)=-1; %row 5th is error

    %% Recovery to orignal packet
    bitstream_re = reshape( newmatrix, [],1);
    bitstream_re(end-80+1:end)=[];%% Remove padding
    matrix_re=reshape(permute(reshape(bitstream_re,size(bitstream_re,2),8,[]),[2 1 3]),8,[]);
    matrix_re=matrix_re'; %Recovery matrix- 

【问题讨论】:

  • 第三步是零填充假设被限制为一行?所以最后一行是 320 + padding?
  • +1 表示努力解释,这几天很少见。
  • @Ayb4btu:添加了 80 个零填充,这意味着 10 行,先生。因为原始矩阵的总行(行)不能被 400 去除
  • @user8264 在您的图表中,我了解第二步中显示的 10 行填充的需要。但是 reshape (取决于转置)会将所有零放在最后 4 列中,或者每 50 列放置半列。第三步暗示你想要最后一行的填充。对于图表中的第三步,您希望在哪里进行填充?
  • 对不起,我认为这是行尾。因为我认为原始填充在末尾,所以在重塑后,它仍然会在矩阵的末尾。有什么错误吗?

标签: matlab matrix


【解决方案1】:

您遇到的问题是因为 MATLAB 使用列优先索引,并且您的操作是按行索引到矩阵中。

这是修改后的代码似乎可以工作 -

error_row = 5; %// row index to be set as error row

bitstream = orignalPacket; %// Assuming orignalPacket is of size 990 x 8

bitstream(end+10,:)=0; %// pad with 10 rows of zeros at the end

%// New matrix 20 x 400
newmatrix = reshape(bitstream.',400,20).';

%// Add one error row
newmatrix(error_row,:)=-1; %// row 5th is error

%// Recovery orignal packet
bitstream_re = reshape(newmatrix.',1,[]); %//'
bitstream_re(end-80+1:end)=[]; %// Remove padding

matrix_re = reshape(bitstream_re,8,[]).'; %//'# Recovered matrix

顺便说一句,您可以实现相同的输出matrix_re,而无需所有这些重塑和繁琐的索引 -

matrix_re = orignalPacket; %// Assuming orignalPacket is of size 990 x 8
error_row = 5; %// row index to be set as error row
matrix_re(50*(error_row-1) + 1 :50*error_row,:) = -1;

【讨论】:

  • 比特流(end+10,:)=0;它是加 10 或 80。我认为它是 80 个零填充。
  • @user8264 从图中看来您打算填充 10 行零,所以我猜bitstream(end+10,:)=0; 是有道理的,不是吗?
  • 对不起,也许我弄错了。上面的代码,我转换为单行 bitstream = reshape( orignalPacket.', [],1); %size 7920 x 1 ,然后我添加 80 填充。但是您没有转换为单行,我认为您是正确的
  • @user8264 是的,我保持 2D 格式,然后填充,由于第一个索引是行索引,我正在扩展行数,列数自动扩展/填充,因为作为我使用的第二个索引:
  • @user8264 更新代码一定更有意义,看看吧。
猜你喜欢
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 2019-06-15
  • 2013-06-07
  • 1970-01-01
  • 2019-06-22
相关资源
最近更新 更多