zigzag模式提取矩陣元素

2021-06-18 21:30:19 字數 2464 閱讀 6425

zigzag模式提取矩陣元素

[email protected]

這節博文只是為了上傳個**而已。希望對需要的人有用。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...