如何使用for循环将矩阵列重新排列成块?
How to rearrange matrix column into block using for loop?
我正在做一个项目,我使用了一个大小为 (512x512) 的图像,然后我将整个图像除以 8,这样就会有 64x64 块,然后我将每个 8x8 图像块重新排列成一个列,我的新尺寸是 64x4069。
现在我想找回原始尺寸,即 512x512,请帮助我如何使用 for 循环而不是 'col2im'
找回它
a=imread('lena.png');
b=double(a);
[m,n] = size(b);
bl=8;
br=m/bl;
bc=n/bl;
out = zeros(size(reshape(b,bl*bl,[])));
count = 1;
for i = 1:br
for j= 1:bc
block = b((j-1)*bl + 1:(j-1)*bl + bl, (i-1)*bl + 1:(i-1)*bl + bl);
out(:,count) = block(:);
count = count + 1;
end
end
这基本上是你的脚本写反了。必须做出一些假设,因为并非每个矩形矩阵都可以从您描述的过程中产生,并且还因为原始矩阵的维度不能从一组块中唯一确定。所以,我假设原始矩阵是一个正方形,块也是正方形。
顺便说一下,在您的代码中,您在公式中使用 j 表示行索引,使用 i 表示列;我认为这是一个错误,并在下面进行了修改。
out = kron((0:3)', 1:16); % for testing; you would have a 64x4096 matrix here
[m,n] = size(out);
osize = sqrt(n*m);
bl = sqrt(m);
br = osize/bl;
bc = br;
original = zeros(osize);
count = 1;
for i = 1:br
for j = 1:bc
block = zeros(bl);
block(:) = out(:,count);
original(1+(i-1)*bl : i*bl, 1+(j-1)*bl : j*bl) = block;
count = count + 1;
end
end
测试输入:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48
输出:
0 2 0 4 0 6 0 8
1 3 2 6 3 9 4 12
0 10 0 12 0 14 0 16
5 15 6 18 7 21 8 24
0 18 0 20 0 22 0 24
9 27 10 30 11 33 12 36
0 26 0 28 0 30 0 32
13 39 14 42 15 45 16 48
我正在做一个项目,我使用了一个大小为 (512x512) 的图像,然后我将整个图像除以 8,这样就会有 64x64 块,然后我将每个 8x8 图像块重新排列成一个列,我的新尺寸是 64x4069。 现在我想找回原始尺寸,即 512x512,请帮助我如何使用 for 循环而不是 'col2im'
找回它a=imread('lena.png');
b=double(a);
[m,n] = size(b);
bl=8;
br=m/bl;
bc=n/bl;
out = zeros(size(reshape(b,bl*bl,[])));
count = 1;
for i = 1:br
for j= 1:bc
block = b((j-1)*bl + 1:(j-1)*bl + bl, (i-1)*bl + 1:(i-1)*bl + bl);
out(:,count) = block(:);
count = count + 1;
end
end
这基本上是你的脚本写反了。必须做出一些假设,因为并非每个矩形矩阵都可以从您描述的过程中产生,并且还因为原始矩阵的维度不能从一组块中唯一确定。所以,我假设原始矩阵是一个正方形,块也是正方形。
顺便说一下,在您的代码中,您在公式中使用 j 表示行索引,使用 i 表示列;我认为这是一个错误,并在下面进行了修改。
out = kron((0:3)', 1:16); % for testing; you would have a 64x4096 matrix here
[m,n] = size(out);
osize = sqrt(n*m);
bl = sqrt(m);
br = osize/bl;
bc = br;
original = zeros(osize);
count = 1;
for i = 1:br
for j = 1:bc
block = zeros(bl);
block(:) = out(:,count);
original(1+(i-1)*bl : i*bl, 1+(j-1)*bl : j*bl) = block;
count = count + 1;
end
end
测试输入:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32
3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48
输出:
0 2 0 4 0 6 0 8
1 3 2 6 3 9 4 12
0 10 0 12 0 14 0 16
5 15 6 18 7 21 8 24
0 18 0 20 0 22 0 24
9 27 10 30 11 33 12 36
0 26 0 28 0 30 0 32
13 39 14 42 15 45 16 48