ええと、固定値を引く必要がある場合は、次のように行う方がよいでしょう。
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には、辞書式順序ですべてのサブ行列が含まれます。例えば
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
そのために使うことができます。
最後に、あなたは断片を切り落とさなければなりません、それは最後の2つの命令がすることです。特に、最初のものはインデックスを生成し(try idx{1}
、...)、2番目のものは部分行列を生成します(try matr{1}
、...)。