矩阵乘法结果值范围

时间:2016-07-16 20:39:13

标签: matlab math matrix matrix-multiplication

这是最初的问题: About the output value range of LeGall 5/3 wavelet

今天我发现实际上变换可以看作是矩阵乘法。很容易将小波系数计算为矩阵(为了估计该值,忽略所有Rounded down动作,这不会影响最大值的估计)。

DWT2的第1级有两个步骤,即在两个方向上执行LeGall 5/3滤波器。如果我们将I视为输入8 * 8矩阵而A视为小波系数矩阵。

  1. 对于水平方向: output1 = I.A

  2. 然后计算垂直方向: 实际上,它可以表示为output2 = output1'.A(使用output1的转置再次乘以A),这将得到我们想要的结果的转置。

  3. 转置输出2。 output_lvl1 = output2'=(output1'.A)'=((IA)'。A)'=(A'.I'.A)'= A'.IA(我在这里详细说明了没有数学的说明符号...)

  4. 小波的第二级仅在LL区域执行,该区域是output_lvl1(1:4,1:4)。基本上过程是相同的(让系数矩阵表示为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'.I.A的值范围是什么?

    1. 如果我们使用output_lvl1(1:4,1:4)作为输入I2,那么B'.I2.B的值范围是什么?
    2. 我真的需要一些数学帮助。提前谢谢。

1 个答案:

答案 0 :(得分: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

嗯,这是结果(将所有可能的最大值放在一个矩阵中,最小值相应地为负):

[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。