zigzag模式提取矩陣元素
這節博文只是為了上傳個**而已。希望對需要的人有用。zig-zag模式如下圖所示。它可以用來按照以下的順序來提取乙個矩陣的元素。
這個東西用在哪呢?用在離散余弦變換的係數提取裡面。離散余弦變換(dct)是種影象壓縮演算法,jpeg-2000好像就是用它來進行影象壓縮的。dct將影象從畫素域變換到頻率域。然後一般影象都存在很多冗餘和相關性的,所以轉換到頻率域之後,只有很少的一部分頻率分量的係數才不為0,大部分係數都為0(或者說接近於0),這樣就可以進行高效的編碼,以達到壓縮的目的。下圖的右圖是對lena圖進行離散余弦變換(dct)得到的係數矩陣圖。從左上角依次到右下角,頻率越來越高,由圖可以看到,左上角的值比較大,到右下角的值就很小很小了。換句話說,影象的能量幾乎都集中在左上角這個地方的低頻係數上面了。
而且,係數的重要性一定程度上是按照zigzag模式進行排列的。所以就可以通過zigzag模式來提取這個矩陣前面的重要性的元素,作為這個影象在頻率域上的特徵,然後可以拿去做分類啥的,以達到降維的功效。
具體**如下:
zigzagcoder.m
function dctvector = zigzagcoder(a, neednumcoefficient)
%// select elements of a square matrix using zig-zag pattern
%// author : zouxy
%// date : 2013-10-28
%// homepage :
%// email : [email protected]
%% input: a : square matrix
%% neednumcoefficient : how many coefficient you want to maintain
%% output: dctvector: vector contain coefficients by col
if size(a, 1) ~= size(a, 2)
display('warning: your matrix should be square!');
if size(a, 1) > size(a, 2)
a = a(1:size(a, 2), 1:size(a, 2));
else
a = a(1:size(a, 1), 1:size(a, 1));
endend
if neednumcoefficient > (size(a, 1) * size(a, 2))
neednumcoefficient = size(a, 1) * size(a, 2);
enda = a';
count = 1;
for dim_sum = 2 : (size(a, 1) + size(a, 2))
if mod(dim_sum, 2) == 0
for i = 1 : size(a, 1)
if dim_sum - i <= size(a, 1) & dim_sum - i > 0
dctvector(count) = a(i, dim_sum - i);
count = count + 1;
endend
else
for i = 1 : size(a, 1)
if dim_sum - i <= size(a, 1) & dim_sum - i >0
dctvector(count) = a(dim_sum - i, i);
count = count + 1;
end
end
endend
dctvector = dctvector(1:neednumcoefficient);
dctvector = dctvector';
end
例如:testzigzagcode.m
mat = [1 2 6; 3 5 7; 4 8 9];
num = size(mat, 1) * size(mat, 2);
code = zigzagcoder(mat, num);
disp(mat);
disp(code');
輸入方陣:
1 2 6
3 5 7
4 8 9
輸出向量:
1 2 3 4 5 6 7 8 9
zigzag遍歷矩陣
按之字型遍歷乙個矩陣。之字形遍歷順序如下圖所示 處理乙個二維矩陣一定不能陷入繁瑣的細節處理中,如果此題思考方向為到了 2 後如何轉向 5,到了 5 後如何轉向 9,到了 9 後又如何轉向 6,這樣程式設計會變得異常複雜。應該抽象出子過程,本題的子過程就是遍歷矩陣斜著的一行,只不過每隔一行遍歷方向改變...
CVTE筆試題2 生成zigzag矩陣
其幾天參加的cvte兩道筆試題,第二道是生成zigzag矩陣,具體如下 給定陣列輸出 1,2,6 3,5,7 4,8,9 vector to zigzagmatrix vector data int temp sqrt n if temp temp n throw new exception 輸入陣...
zigzag矩陣按照之字形線路產生方法(C )
includeusing namespace std void zigzag int m,int n else if prestep 4 else if prestep 4 上一步右上方向走,則現在向右走一步 else if prestep 1 上一步向右走,現在需要向左下走一步 else else...