矩阵划分&置换实现贝克图

时间:2013-12-19 11:57:41

标签: matlab

我正在尝试实施Baker地图。 是否有一个函数可以通过提供例如除数2,4,2的序列来划分8 x 8矩阵,并按照下面的矩阵中所示的顺序重新排列像素?

X = reshape(1:64,8,8);

在将除数2,4,2应用到矩阵X之后,应该得到如下所示的矩阵。

A=[31 23 15 7 32 24 16 8;
  63 55 47 39 64 56 48 40;
  11 3 12 4 13 5 14 6;
  27 19 28 20 29 21 30 22;
  43 35 44 36 45 37 46 38;
  59 51 60 52 61 53 62 54;
  25 17 9 1 26 18 10 2;
  57 49 41 33 58 50 42 34]

我正在处理的文件的链接是: http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.39.5132&rep=rep1&type=pdf

这就是我想要实现的目标:

enter image description here

1 个答案:

答案 0 :(得分:2)

编辑:更通用的解决方案:

%function Z = bakermap(X,divisors)
function Z = bakermap()
X = reshape(1:64,8,8)'
divisors = [ 2 4 2 ];

[x,y] = size(X);

offsets = sum(divisors)-fliplr(cumsum(fliplr(divisors)));

if any(mod(y,divisors)) && ~(sum(divisors) == y)
    disp('invalid divisor vector')
    return
end

blocks = @(div) cell2mat( cellfun(@mtimes, repmat({ones(x/div,div)},div,1),...
                                           num2cell(1:div)',...
                                          'UniformOutput',false)         );

%create index matrix
I = [];
for ii = 1:numel(divisors);
     I = [I, blocks(divisors(ii))+offsets(ii)];
end

%create Baker map
Y = flipud(X);
Z = [];
for jj=1:I(end)
    Z = [Z; Y(I==jj)'];
end


Z = flipud(Z);
end

<强>返回:

索引矩阵:

I =

     1     1     3     3     3     3     7     7
     1     1     3     3     3     3     7     7
     1     1     4     4     4     4     7     7
     1     1     4     4     4     4     7     7
     2     2     5     5     5     5     8     8
     2     2     5     5     5     5     8     8
     2     2     6     6     6     6     8     8
     2     2     6     6     6     6     8     8

贝克地图:

Z  =

    31    23    15     7    32    24    16     8
    63    55    47    39    64    56    48    40
    11     3    12     4    13     5    14     6
    27    19    28    20    29    21    30    22
    43    35    44    36    45    37    46    38
    59    51    60    52    61    53    62    54
    25    17     9     1    26    18    10     2
    57    49    41    33    58    50    42    34

但是看一下if条件,这些情况就是可能的。我不知道这是否足够。我也试过像divisors = [ 1 4 1 2 ]这样的东西 - 它起作用了。只要所有除数的总和等于行长和模数,就不应该有问题。


<强>说明: 带输入参数的匿名函数的%定义:div:divisor vector

blocks = @(div) cell2mat( ...          % converts final result into matrix
                cellfun(@mtimes, ...   % multiplies the next two inputs A,B
                repmat(...             % A...
                {ones(x/div,div)},...  % cell with a matrix of ones in size
                                         of one subblock, e.g. [1,1,1,1;1,1,1,1]
                div,1),...             % which is replicated div-times according 
                                         to actual by cellfun processed divisor
                num2cell(1:div)',...   % creates a vector [1,2,3,4...] according
                                         to the number of divisors, so so finally
                                         every Block A gets an increasing factor 
               'UniformOutput',false...% necessary additional property of cellfun
               )); 

还可以查看this revision,了解正在发生的事情。你请求了一个通用的解决方案,就像上面那个,链接的是一个更多的手动输入。