如何在matlab中用大矩阵制作一个矩阵块?

时间:2012-11-27 20:47:41

标签: matlab matrix octave

我有一个256x256矩阵,我想创建8x8矩阵块。我有一个下面的代码,它只显示一个块,我想要所有的块,然后从矩阵的每个元素中减去一个数字。当我从每个元素中减去128时,它不会显示负值而只显示0。

[x,y] = size(M);

for i=1:8
   for j=1:8
      k(i,j) = M(i,j);
   end
end

disp(k);

for a=1:size(k)
   for b=1:size(k)
     A(a,b) = k(a,b) - 128;
   end
end

disp(A);

2 个答案:

答案 0 :(得分:1)

好吧,如果你必须减去一个固定值,最好这样做

M = M - 128;

它更快。

你说你得到0值而不是负值;这很可能是由于矩阵的类型是unsigned(即这些人只是积极的)。强制转换为一般整数是必要的。尝试:

M = int16(M) - 128;

为了获得我提出以下建议的分区,可以有更有效的方法,顺便说一下:

r = rand(256,256);            %// test case, substitute with your matrix M
[i j] = meshgrid(1:8:256);    %// lattice of indices      
idx = num2cell([ i(:) , j(:) ],2); %// cell version 

matr = cellfun( @(i) r(i(1):i(1)+7,i(2):i(2)+7), idx, 'UniformOutput',false); %// blocks

matr将按字典顺序包含所有子矩阵。 e.g。

matr{2}

ans =

0.4026    0.3141    0.4164    0.5005    0.6952    0.1955    0.9803    0.5097
0.8186    0.9280    0.1737    0.6133    0.8562    0.7405    0.8766    0.0975
0.2704    0.8333    0.1892    0.7661    0.5168    0.3856    0.1432    0.9958
0.9973    0.8488    0.6937    0.2630    0.1004    0.5842    0.1844    0.5206
0.4052    0.0629    0.6982    0.1530    0.9234    0.1271    0.7317    0.3541
0.2984    0.3633    0.1510    0.0297    0.0225    0.7945    0.2925    0.0396
0.5097    0.0802    0.8744    0.1032    0.8523    0.6150    0.4845    0.5703
0.8635    0.0194    0.1879    0.5017    0.5297    0.6319    0.2406    0.5125

说明:在matlab中,您可以有效地操作矩阵和切片。例如,您可以轻松复制子矩阵,例如第一个8x8矩阵是

  sub = M(1:8,1:8);

你想要所有的子矩阵,因此你需要一种索引的格子来获得

  sub_ij = M(1+8*(i-1) : 7 * 8*(i-1) , 1+8*(j-1) : 7 * 8*(j-1))

即。你需要格子

  (1+8*(i-1) : 7 * 8*(i-1) , 1+8*(j-1) : 7 * 8*(j-1))   % // for all i,j

您可以使用meshgrid

最后你必须切断碎片,这是最后两条指令的作用。特别是第一个生成索引(try idx{1},...),第二个生成子矩阵(try matr{1},...)。

答案 1 :(得分:0)

希望code帮助你。它具有16x16图像,可分为4x4块。您可以根据需要更改值并获得所需的输出。