矩阵乘法结果取值范围
matrix multiplication result value range
这是最初的问题:
About the output value range of LeGall 5/3 wavelet
今天发现其实transform可以看作是矩阵乘法。小波系数很容易计算为矩阵(为了估计值,忽略所有向下舍入的动作,不会影响最大值的估计)。
DWT2的第1级有两个步骤,即在两个方向上进行LeGall 5/3过滤。如果我们将 I 视为输入 8*8 矩阵,将 A 视为小波系数矩阵。
对于水平方向:
输出 1 = I.A
然后计算垂直方向:
其实可以表示为output2 = output1'.A(用output1的转置再乘A)就得到了我们想要的结果的转置。
转置输出 2。
output_lvl1 = output2' = (output1'.A)' = ((I.A)'.A)' = (A'.I'.A)'=A'.I.A (我把细节放在这里是为了在没有数学符号的情况下清楚...)
而小波的第2级仅在output_lvl1(1:4,1:4)的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和Input(matrix I)的取值范围是-128到+127,那么output_lvl1 = A'.I.A?
的取值范围是多少
- 如果我们使用output_lvl1(1:4,1:4)作为输入I2,B'的取值范围是多少。I2.B?
我真的需要一些数学帮助。提前谢谢你。
好吧,我终于找到了解决这个问题的方法。
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就是我要找的
这是最初的问题: About the output value range of LeGall 5/3 wavelet
今天发现其实transform可以看作是矩阵乘法。小波系数很容易计算为矩阵(为了估计值,忽略所有向下舍入的动作,不会影响最大值的估计)。
DWT2的第1级有两个步骤,即在两个方向上进行LeGall 5/3过滤。如果我们将 I 视为输入 8*8 矩阵,将 A 视为小波系数矩阵。
对于水平方向: 输出 1 = I.A
然后计算垂直方向: 其实可以表示为output2 = output1'.A(用output1的转置再乘A)就得到了我们想要的结果的转置。
转置输出 2。 output_lvl1 = output2' = (output1'.A)' = ((I.A)'.A)' = (A'.I'.A)'=A'.I.A (我把细节放在这里是为了在没有数学符号的情况下清楚...)
而小波的第2级仅在output_lvl1(1:4,1:4)的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和Input(matrix I)的取值范围是-128到+127,那么output_lvl1 = A'.I.A?
的取值范围是多少- 如果我们使用output_lvl1(1:4,1:4)作为输入I2,B'的取值范围是多少。I2.B?
我真的需要一些数学帮助。提前谢谢你。
好吧,我终于找到了解决这个问题的方法。 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就是我要找的