2016-07-16 6 views
0

は最初の質問です。ウェーブレット係数を行列として計算するのは簡単です(値を推定するために、すべての丸め処理は無視され、最大値の推定には影響しません)。行列の乗算結果の値の範囲

DWT2の第1レベルには、2方向にLeGall 5/3フィルタを実行する2つのステップがあります。入力8 * 8行列をI、ウェーブレット係数行列をAとすると、水平方向について

  1. : OUTPUT1 = IA

  2. そして垂直方向に計算される:実際に が、それはOUTPUT2 = output1'.Aとして表すことができる(のOUTPUT1の転置を使用Aをもう一度掛けてください)、私たちが望む結果の転置を得ることができます。

  3. 出力2を転置します。 output_lvl1 = output2 '=(output1'.A)' =((IA) 'A)' =(A'.I'A) '= A'.IA(ここでは、 4,1:4)数学記号...)

ウェーブレットの第2レベルのみoutput_lvl1(1 LLの領域で行われます。基本的には、プロセスは同じです(係数行列をBと表記します)。ここで

は(...期待し、それが正しい)AとBが私の計算に基づいて行列の係数である

A = [0.75 -0.125 0  0  -0.5 0 0 0; 
     0.5  0.25 0  0  1 0 0 0; 
     -0.25 0.75 -0.125 0  -0.5 -0.5 0 0; 
     0  0.25 0.25 0  0 1 0 0; 
     0  -0.125 0.75 -0.125 0 -0.5 -0.5 0 
     0  0  0.25 0.25 0 0 1 0; 
     0  0  -0.125 0.625 0 0 -0.5 -1; 
     0  0  0  0.25 0 0 0 1]; 

B = [0.75 -0.125 -0.5 0; 
    0.5 0.25 1 0; 
    -0.25 0.75 -0.5 -1; 
    0  0.125 0 1]; 

そして今、問題になった: 1.私たちはAおよび範囲を知っていれば入力(行列I)の値は-128から+127ですが、output_lvl1 = A'.IAの値の範囲は?

  1. output_lvl1(1:4,1:4)を入力I2として使用すると、B'.I2.Bの値の範囲は?

私は本当にここで数学の助けが必要です。前もって感謝します。

+0

try http://math.stackexchange.com/ – kangshiyin

+0

試してみましたが、回答がありません... – qiuhan1989

答えて

1

最後に、私はこれを解決する方法を見つけました。 SymPy libは本当に必要なものです。

最大値はB'I2.Bの結果でのみ可能でした。だからプログラムがこれを行うでしょう。

from sympy import * 
def calcu_max(strin): 
    x=0 
    strin1 = str(strin).replace('*',' ').replace('+',' ').replace('-',' ') 
    strin1 = strin1.split(' ') 
    for ele in strin1: 
     if '[' in ele or ']' in ele or ele =='': 
      continue 
     x = x + float(ele) 
    return x 

DWT1 = Matrix(8, 8, [0.75, -0.125, 0, 0,-0.5, 0, 0, 0, 0.5, 0.25, 0, 0, 1, 0, 0, 0, -0.25, 0.75, -0.125, 0, -0.5, -0.5, 0, 0, 0, 0.25, 0.25, 0, 0, 1, 0, 0, 0,-0.125, 0.75, -0.125, 0, -0.5, -0.5, 0, 0, 0, 0.25, 0.25, 0, 0, 1, 0, 0, 0, -0.125, 0.625, 0, 0, -0.5, -1, 0, 0, 0, 0.25, 0, 0, 0, 1]) 

Input1 = MatrixSymbol('A',8,8) 
DWT1_t = Transpose(DWT1) 

output_lvl1_1d = DWT1_t*Input1 
output_lvl1_2d = output_lvl1_1d* DWT1 

#print 'output_lvl1_2d[0,0]: ' 
#print simplify(output_lvl1_2d[0,0]) 

#bulit 2nd lvl input from the lvl1 output (1:4,1:4) 

input_lvl2 = output_lvl1_2d[0:4,0:4] 

DWT2 = Matrix(4, 4, [0.75, -0.125, -0.5, 0, 0.5, 0.25, 1, 0, -0.25, 0.75, -0.5, -1, 0, 0.125, 0, 1]) 

DWT2_t = Transpose(DWT2) 

output_lvl2_1d = DWT2_t*input_lvl2 
output_lvl2_2d = output_lvl2_1d * DWT2 


#Lvl 2 calculate max 
max_lvl2 = zeros(4,4) 
for i in range(4): 
    for j in range(4): 
     max_lvl2[i,j]=128.0*calcu_max(simplify(output_lvl2_2d[i,j])) 
     print str(i)+' '+str(j)+' '+str(max_lvl2[i,j]) 
     #print max_lvl2[i,j] 
print max_lvl2 

さて、ここでの結果は、(1つの行列内のすべての可能な最大値を入れて、最小値は相応に否定している)である。そして、

[338.000000000000, 266.500000000000, 468.000000000000, 468.000000000000], 
[266.500000000000, 210.125000000000, 369.000000000000, 369.000000000000], 
[468.000000000000, 369.000000000000, 648.000000000000, 648.000000000000], 
[468.000000000000, 369.000000000000, 648.000000000000, 648.000000000000] 

648は、私が探していますものです。