【数学建模】模糊数学矩阵运算——python实现

一、矩阵运算

        续上一篇有关模糊数学的运算中的内容,这一篇文章将进行模糊矩阵自反性判断、对称性判断、传递性的判断以及来计算传递闭包矩阵。这里事实上也是聚类分析等前操步骤。可以参考之前有关模糊聚类分析的内容,其中也有一些比较有参考意义的代码。

① 模糊矩阵自反性判断:

        都默认为nxn阶模糊方阵

        即rii=1

def zfar(M):
    a=[]
    for i in range(len(M)):
        m=M[i]
        if m[i]!=1:
            a.append('0')
    if len(a)==0:
        return 'True' 
    else:
        return 'False'
print(zfar(ma))
ma=[[1,0,0],
    [0,1,0],
    [0,0,1]]
#输出结果为
True

② 模糊矩阵对称性判断:

        即rij=rji

def dcar(M):
    Mt=np.stack(M,axis=1)
    print(Mt)
    a=[]
    for i in range(len(M)):
        m=M[i]
        mt=Mt[i]
        for j in range(len(m)):
            if m[j]!=mt[j]:
               a.append('1')
    if len(a)==0:
        return 'True'
    else:
        return 'False'
ma=[[1,0,0],
    [0,1,0],
    [0,0,1]]
print(dcar(ma))
输出结果为:
True

③ 模糊相似矩阵判断:

        即同时满足自反性和对称性:

def arlike(M):
    if zfar(M) == 'True' and dcar(M) == 'True':
        return 'Ture'
    else:
        return 'False'
print(arlike(ma))

④ 模糊矩阵传递性判断

def jzhc(M,N):#必须是m*s,s*n的矩阵输入
    R=[]
    N=np.stack(N,axis=1)#实现转置
    for i in range(len(M)):
        mr=[]
        for j in range(len(N)):
            r=(arjj([M[i]],[N[j]]))[0]
            mr.append(max(r))
        R.append(mr)
    return R

def cdar(M):
    hcar=jzhc(M,M)#使用矩阵合成代码
    print(hcar)
    a=[]
    for i in range(len(M)):
        m=M[i]
        n=hcar[i]
        for j in range(len(m)):
            if m[j]>n[j]:
                a.append('1')
    if len(a)==0:
        return 'True'
    else:
        return 'False'
print(cdar(ma))

⑤ 模糊等价矩阵判断:

        即同时满足对称、自反和传递矩阵

def djar(M):
    if arlike(M) == 'Ture' and cdar(M) == 'True':
        return 'True'
    else:
        return 'False'
print(djar(ma))

⑥ 传递闭包矩阵计算:

        返回传递闭包矩阵和幂数

#相等矩阵的判断
def ddar(M,Mt):
    a=[]
    for i in range(len(M)):
        m=M[i]
        mt=Mt[i]
        for j in range(len(m)):
            if m[j]!=mt[j]:
               a.append('1')
    if len(a)==0:
        return 'True'
    else:
        return 'False'

#传递闭包矩阵
def bbar(M):
    if arlike(M)!='True':
        return 'Array False'
    else:
        b=M
        c=2
        while ddar(b,M)!='True':
            M=jzhc(b,b)
            b=M
            c=c+2
            break    
        return b,c
R=[[1,0.1,0.2],
    [0.1,1,0.3],
    [0.2,0.3,1]]
print(bbar(R))
##输出结果为:
([[1, 0.1, 0.2], [0.1, 1, 0.3], [0.2, 0.3, 1]], 2)

二、总结

        ① 理论先行

        ② 代码自写(不要复制粘贴),以上代码全部都是以最基础的逻辑运算来写的,只要会python基础就能实现,不涉及任何需要调动库中复杂的函数的理解。全是for if while def

        ③ 标准化的方式将于后文继续介绍。

        ④ 代码总结

def dcar(M):
    Mt=np.stack(M,axis=1)
    print(Mt)
    a=[]
    for i in range(len(M)):
        m=M[i]
        mt=Mt[i]
        for j in range(len(m)):
            if m[j]!=mt[j]:
               a.append('1')
    if len(a)==0:
        return 'True'
    else:
        return 'False'
ma=[[1,0,0],
    [0,1,0],
    [0,0,1]]
print(dcar(ma))

def zfar(M):
    a=[]
    for i in range(len(M)):
        m=M[i]
        if m[i]!=1:
            a.append('0')
    if len(a)==0:
        return 'True' 
    else:
        return 'False'
print(zfar(ma))

def arlike(M):
    if zfar(M) == 'True' and dcar(M) == 'True':
        return 'True'
    else:
        return 'False'
print(arlike(ma))

def cdar(M):
    hcar=jzhc(M,M)
    a=[]
    for i in range(len(M)):
        m=M[i]
        n=hcar[i]
        for j in range(len(m)):
            if m[j]>n[j]:
                a.append('1')
    if len(a)==0:
        return 'True'
    else:
        return 'False'
print(cdar(ma))

def djar(M):
    if arlike(M) == 'Ture' and cdar(M) == 'True':
        return 'True'
    else:
        return 'False'
print(djar(ma))


#相等矩阵的判断
def ddar(M,Mt):
    a=[]
    for i in range(len(M)):
        m=M[i]
        mt=Mt[i]
        for j in range(len(m)):
            if m[j]!=mt[j]:
               a.append('1')
    if len(a)==0:
        return 'True'
    else:
        return 'False'

#传递闭包矩阵
def bbar(M):
    if arlike(M)!='True':
        return 'Array False'
    else:
        b=M
        c=2
        while ddar(b,M)!='True':
            M=jzhc(b,b)
            b=M
            c=c+2
            break    
        return b,c
R=[[1,0.1,0.2],
    [0.1,1,0.3],
    [0.2,0.3,1]]
print(bbar(R))

            

猜你喜欢

转载自blog.csdn.net/m0_56120502/article/details/124587544