1. 大纲

  • 给定一个秩为1的矩阵A,m行,n列,如果在矩阵A中给定m+n-1 个非零的值,请问如何填充这个矩阵A,使得矩阵A 填满?
  • 卷积和循环卷积矩阵,通过信号与系统中的卷积方式处理相关数据,求循环卷积矩阵的特征值和特征向量?

2. 填充秩1矩阵

2.1 举例

假设我们有一个矩阵A,我们定义其秩为1,,3行3列,具体组成如下:
A = [ 3 4 5 6 a 22 a 23 9 a 32 a 33 ] ; R a n k ( A ) = 1 \begin{equation} A=\begin{bmatrix} 3&4&5\\\\ 6&a_{22}&a_{23}\\\\ 9&a_{32}&a_{33} \end{bmatrix};\mathrm{Rank(A)=1} \end{equation} A= 3694a22a325a23a33 ;Rank(A)=1

  • 因为我们知道矩阵A的秩为1,那么我们可以通过比例计算出其他值,具体如下:
    a 22 = 6 ⋅ 4 3 = 8 ; a 23 = 6 ⋅ 5 3 = 10 ; a 32 = 9 ⋅ 4 3 = 12 ; a 33 = 9 ⋅ 5 3 = 15 ; \begin{equation} a_{22}=\frac{6\cdot4}{3}=8;a_{23}=\frac{6\cdot5}{3}=10;a_{32}=\frac{9\cdot4}{3}=12;a_{33}=\frac{9\cdot5}{3}=15; \end{equation} a22=364=8;a23=365=10;a32=394=12;a33=395=15;

2.2 二分图

我们根据给定的矩阵A,来绘制对应的二分图,二分图中没有形成闭环,所以可以填满矩阵A的值
,给定的非零值,任意四个组成的行列式为非零行列式
在这里插入图片描述

3. 循环卷积矩阵

循环卷积矩阵C,每一列元素一样,但是第i列通过移位得到第i+1列
C = [ 2 5 1 0 0 2 5 1 1 0 2 5 5 1 0 2 ] \begin{equation} C=\begin{bmatrix} 2&5&1&0\\\\ 0&2&5&1\\\\ 1&0&2&5\\\\ 5&1&0&2 \end{bmatrix} \end{equation} C= 2015520115200152

  • 循环矩阵P表示如下:
    P = [ 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 ] ; X a = [ x 1 x 2 x 3 x 4 ] ; [ 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 ] [ x 1 x 2 x 3 x 4 ] = [ x 2 x 3 x 4 x 1 ] \begin{equation} P=\begin{bmatrix} 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0 \end{bmatrix};X_a=\begin{bmatrix} x_1\\\\ x_2\\\\ x_3\\\\ x_4 \end{bmatrix};\begin{bmatrix} 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0 \end{bmatrix}\begin{bmatrix} x_1\\\\ x_2\\\\ x_3\\\\ x_4 \end{bmatrix}=\begin{bmatrix} x_2\\\\ x_3\\\\ x_4\\\\ x_1 \end{bmatrix} \end{equation} P= 0001100001000010 ;Xa= x1x2x3x4 ; 0001100001000010 x1x2x3x4 = x2x3x4x1
  • 我们发现,通过循环矩阵P可以将向量X中的元素进行元素循环。
    P = [ 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 ] ; P 2 = [ 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0 ] ; P 3 = [ 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 ] ; P 4 = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] = I ; \begin{equation} P=\begin{bmatrix} 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0 \end{bmatrix};P^2=\begin{bmatrix} 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0\\\\ 0&1&0&0 \end{bmatrix};P^3=\begin{bmatrix} 0&0&0&1\\\\ 1&0&0&0\\\\ 0&1&0&0\\\\ 0&0&1&0 \end{bmatrix};P^4=\begin{bmatrix} 1&0&0&0\\\\ 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1 \end{bmatrix}=I; \end{equation} P= 0001100001000010 ;P2= 0010000110000100 ;P3= 0100001000011000 ;P4= 1000010000100001 =I;
  • 那么对于任意一个循环卷积矩阵来说,可以表示如下:
    在这里插入图片描述
  • 矩阵P的特征向量就是矩阵C的特征向量
  • 矩阵P的特征值,特征向量
    P = [ 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 ] ; [ 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 ] [ 1 1 1 1 ] = [ 1 1 1 1 ] ⇒ λ 1 = 1 , v 1 = [ 1 1 1 1 ] ; \begin{equation} P=\begin{bmatrix} 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0 \end{bmatrix};\begin{bmatrix} 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0 \end{bmatrix}\begin{bmatrix} 1\\\\1\\\\1\\\\1\end{bmatrix}=\begin{bmatrix} 1\\\\1\\\\1\\\\1\end{bmatrix}\Rightarrow \lambda_1=1,v_1=\begin{bmatrix} 1\\\\1\\\\1\\\\1\end{bmatrix};\end{equation} P= 0001100001000010 ; 0001100001000010 1111 = 1111 λ1=1,v1= 1111 ;

[ 0 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 ] [ 1 − 1 1 − 1 ] = − 1 ⋅ [ 1 − 1 1 − 1 ] ⇒ λ 2 = − 1 , v 2 = [ 1 − 1 1 − 1 ] ; \begin{equation} \begin{bmatrix} 0&1&0&0\\\\ 0&0&1&0\\\\ 0&0&0&1\\\\ 1&0&0&0 \end{bmatrix}\begin{bmatrix} 1\\\\-1\\\\1\\\\-1\end{bmatrix}=-1\cdot\begin{bmatrix} 1\\\\-1\\\\1\\\\-1\end{bmatrix}\Rightarrow \lambda_2=-1,v_2=\begin{bmatrix} 1\\\\-1\\\\1\\\\-1\end{bmatrix};\end{equation} 0001100001000010 1111 =1 1111 λ2=1,v2= 1111 ;

4. Python 代码numpy 版

  • 代码,简单示意
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @FileName  :numpy_circustant.py
# @Time      :2024/9/24 20:21
# @Author    :Jason Zhang
import numpy as np

np.set_printoptions(suppress=True, precision=3)


class Eigenvalue():
    def __init__(self, array):
        self.array = array
        self.value, self.vector = np.linalg.eig(self.array)

    def __str__(self):
        return f"array:\n{self.array}:\n eigenvalue:\n{self.value}\n,eigenveotr:\n{self.vector}"


class Circulant_Matrix():
    def __init__(self, array):
        self.array = array

    def circulant(self):
        N = np.size(self.array)
        CM = np.array([np.roll(self.array, i) for i in range(N)])
        my_cir = Eigenvalue(CM)
        print(my_cir)

    def get_circulant(self):
        N1 = np.size(self.array)
        Get_CM = np.array([np.roll(self.array, i) for i in range(N1)])
        return Get_CM


if __name__ == "__main__":
    run_code = 0
    N = 5
    # a = np.arange(4)
    a = np.array([2, 5, 1, 0])
    a_cm = Circulant_Matrix(a)
    a_cm.circulant()
    a_circulant = a_cm.get_circulant()
    P = np.array([[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, 0]])
    P2 = P @ P
    P3 = P2 @ P
    print(f"P=\n{P}")
    print(f"P2=\n{P2}")
    print(f"P3=\n{P3}")
    P_eigen = Eigenvalue(P)
    P2_eigen = Eigenvalue(P2)
    P3_eigen = Eigenvalue(P3)
    print(f"P_eigen=\n{P_eigen}")
    print(f"P2_eigen=\n{P2_eigen}")
    print(f"P3_eigen=\n{P3_eigen}")
    c = np.array([1, 2, 3, 4])
    c_P = P @ c
    c_P2 = P2 @ c
    c_P3 = P3 @ c
    print(f"c={c}")
    print(f"c_P={c_P}")
    print(f"c_P2={c_P2}")
    print(f"c_P3={c_P3}")
    print(f"a_circulant=\n{a_circulant}")
    a_I = np.eye((4))
    a_new = a_I * a[0] + P * a[1] + P2 * a[2] + P3 * a[3]
    a_0 = a_I * a[0]
    a_1 = P * a[1]
    a_2 = P2 * a[2]
    a_3 = P3 * a[3]
    P4 = P3 @ P
    print(f"a_I=\n{a_I}")
    print(f"a_new=\n{a_new}")
    print(f"a_circulant=\n{a_circulant}")
    print(f"a_0=\n{a_0}")
    print(f"a_1=\n{a_1}")
    print(f"a_2=\n{a_2}")
    print(f"a_3=\n{a_3}")
    print(f"P4=\n{P4}")
    m1 = np.array([3, 1, 2])
    m2 = np.array([4, 6, 1])
    m12_default = np.convolve(m1, m2)
    m12_same = np.convolve(m1, m2, mode='same')
    print(f"m12_default=\n{m12_default}")
    print(f"m12_same=\n{m12_same}")
    m1_circulant = Circulant_Matrix(m1)
    get_m1_circulant = m1_circulant.get_circulant().T
    m12_circulant = get_m1_circulant @ m2
    print(f"m12_circulant ={m12_circulant}")
  • 结果:
array:
[[2 5 1 0]
 [0 2 5 1]
 [1 0 2 5]
 [5 1 0 2]]:
 eigenvalue:
[ 8.+0.j  1.+5.j  1.-5.j -2.+0.j]
,eigenveotr:
[[-0.5+0.j  -0.5-0.j  -0.5+0.j   0.5+0.j ]
 [-0.5+0.j  -0. -0.5j -0. +0.5j -0.5+0.j ]
 [-0.5+0.j   0.5+0.j   0.5-0.j   0.5+0.j ]
 [-0.5+0.j   0. +0.5j  0. -0.5j -0.5+0.j ]]
P=
[[0 1 0 0]
 [0 0 1 0]
 [0 0 0 1]
 [1 0 0 0]]
P2=
[[0 0 1 0]
 [0 0 0 1]
 [1 0 0 0]
 [0 1 0 0]]
P3=
[[0 0 0 1]
 [1 0 0 0]
 [0 1 0 0]
 [0 0 1 0]]
P_eigen=
array:
[[0 1 0 0]
 [0 0 1 0]
 [0 0 0 1]
 [1 0 0 0]]:
 eigenvalue:
[-1.+0.j  0.+1.j  0.-1.j  1.+0.j]
,eigenveotr:
[[-0.5+0.j   0. -0.5j  0. +0.5j -0.5+0.j ]
 [ 0.5+0.j   0.5+0.j   0.5-0.j  -0.5+0.j ]
 [-0.5+0.j  -0. +0.5j -0. -0.5j -0.5+0.j ]
 [ 0.5+0.j  -0.5+0.j  -0.5-0.j  -0.5+0.j ]]
P2_eigen=
array:
[[0 0 1 0]
 [0 0 0 1]
 [1 0 0 0]
 [0 1 0 0]]:
 eigenvalue:
[ 1. -1.  1. -1.]
,eigenveotr:
[[ 0.707  0.707  0.     0.   ]
 [ 0.     0.    -0.707 -0.707]
 [ 0.707 -0.707  0.     0.   ]
 [ 0.     0.    -0.707  0.707]]
P3_eigen=
array:
[[0 0 0 1]
 [1 0 0 0]
 [0 1 0 0]
 [0 0 1 0]]:
 eigenvalue:
[-1.+0.j  0.+1.j  0.-1.j  1.+0.j]
,eigenveotr:
[[-0.5+0.j   0. -0.5j  0. +0.5j -0.5+0.j ]
 [ 0.5+0.j  -0.5+0.j  -0.5-0.j  -0.5+0.j ]
 [-0.5+0.j  -0. +0.5j -0. -0.5j -0.5+0.j ]
 [ 0.5+0.j   0.5+0.j   0.5-0.j  -0.5+0.j ]]
c=[1 2 3 4]
c_P=[2 3 4 1]
c_P2=[3 4 1 2]
c_P3=[4 1 2 3]
a_circulant=
[[2 5 1 0]
 [0 2 5 1]
 [1 0 2 5]
 [5 1 0 2]]
a_I=
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]
a_new=
[[2. 5. 1. 0.]
 [0. 2. 5. 1.]
 [1. 0. 2. 5.]
 [5. 1. 0. 2.]]
a_circulant=
[[2 5 1 0]
 [0 2 5 1]
 [1 0 2 5]
 [5 1 0 2]]
a_0=
[[2. 0. 0. 0.]
 [0. 2. 0. 0.]
 [0. 0. 2. 0.]
 [0. 0. 0. 2.]]
a_1=
[[0 5 0 0]
 [0 0 5 0]
 [0 0 0 5]
 [5 0 0 0]]
a_2=
[[0 0 1 0]
 [0 0 0 1]
 [1 0 0 0]
 [0 1 0 0]]
a_3=
[[0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]
 [0 0 0 0]]
P4=
[[1 0 0 0]
 [0 1 0 0]
 [0 0 1 0]
 [0 0 0 1]]
m12_default=
[12 22 17 13  2]
m12_same=
[22 17 13]
m12_circulant =[25 24 17]
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐