模糊关系合成运算的Matlab实现

最近课程学到模糊数学,里面有关于模糊关系合成运算传递闭包的概念,十分不好理解,本来想手算几个例子来理解的,结果算到一半就烦了还十分容易算错,于是我就打算用matlab编写一个。

这里就不讲什么是模糊关系合成运算了。百度上能搜到的我这里就不赘述了,网上也有很多关于传递闭包的解释,都比较通俗易懂。我看到教材求传递闭包的方法就是模糊矩阵反复自乘,当结果t(.R)不改变的时候即为传递闭包的值。

那么首先要编程的就是如何算模糊关系合成运算,也有人称为模糊矩阵乘积,算法是“先取小后取大”。用max()函数,min()函数就能搞定,最后再根据矩阵运算规则。于是有

function [R]=fuzzymm(A,B)
%模糊矩阵合成运算的Matlab实现
%运算规则,先"取小后取大"
%输入必须为二阶矩阵A为m行n列, B为n行p列;
[m,n]=size(A);[q,p]=size(B);%获得输入矩阵的维度信息
if n~=q
    disp('第一个矩阵的列数和第二个矩阵的行数不相同!');
else
    R=zeros(m,p);%初始化矩阵
for k =1:m    
    for j=1:p
        temp=[];
        for i =1:n
            Min = min(A(k,i),B(i,j)); %求出第i对的最小值
            temp=[temp Min]; %将求出的最小值加入的数组中
        end
        R(k,j)=max(temp);
    end
end
end
end

我们来测试一下

clc
clear all;
A=[0.3 0.7 0.2;1,0,0.4;0,0.5,1;0.6,0.7,0.8];
B=[0.1,0.9;0.9,0.1;0.6,0.4];
[R]=fuzzymm(A,B);
disp(R)

得到的结果

    0.7000    0.3000
    0.4000    0.9000
    0.6000    0.4000
    0.7000    0.6000

结果正确!
那么求传递闭包的只需将传入的矩阵设为相同就可以了!
那么模糊相似矩阵的传递闭包怎么求呢,只需要反复调用函数,当结果不改变时,即为该模糊相似矩阵的传递闭包。
例如:
[1 0.1 0.8 0.5 0.3;
0.1 1 0.1 0.2 0.4;
0.8 0.1 1 0.3 0.1;
0.5 0.2 0.3 1 0.6;
0.3 0.4 0.1 0.6 1]

clc
clear all
R=[1 0.1 0.8 0.5 0.3;0.1 1 0.1 0.2 0.4;0.8 0.1 1 0.3 0.1;0.5 0.2 0.3 1 0.6;0.3 0.4 0.1 0.6 1];
[tR]=fuzzymm(R,R)

于是有
如图
再次相乘
如图
再次相乘,发现结果不改变
如图
故求得传递闭包

  • 6
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值