最近课程学到模糊数学,里面有关于模糊矩阵乘法,传递闭包的概念,十分不好理解,本来想手算几个例子来理解的,结果算到一半就烦了还十分容易算错,于是我就打算用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)
结果正确!
那么求传递闭包的只需将传入的矩阵设为相同就可以了!
那么模糊相似矩阵的传递闭包怎么求呢,只需要反复调用函数,当结果不改变时,即为该模糊相似矩阵的传递闭包。
例如:
[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)
于是有
再次相乘
再次相乘,发现结果不改变
故求得传递闭包。