我正在尝试实施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
这就是我想要实现的目标:
答案 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,了解正在发生的事情。你请求了一个通用的解决方案,就像上面那个,链接的是一个更多的手动输入。