【转载】用MATLAB计算空间权重矩阵【反距离和经济距离嵌套矩阵】

直接扣代码

打开即食,方便简单

%主要应用了matlab的distance函数。
%计算30个省区市行标准化后的地理空间权重矩阵 W。要计算别的,更改以下的30为对应数字即可
%{
选中下面两行,按F9快捷键新建纬度x和经度y矩阵
x=[] %x为纬度,按列粘贴
y=[] %y为经度,按列粘贴
%}
x = [40.48
26.35
43.45
38.27
23.08
22.48
20.02
29.59
30.4
36.04
36.38
34.17
29.39
25.04
]
y = [111.41
106.42
87.36
106.16
113.14
108.19
110.2
106.54
104.04
103.51
101.48
108.57
91.08
102.42
]
A=[x y]  
for i=1:14
    for j=1:14
        B(i,j)=distance(A(i,1),A(i,2),A(j,1),A(j,2)); %根据经纬度计算地点间的距离,主要应用distance函数,详细可以百度
    end
end
%B算出来的单位是度。换算成距离的话,需要再乘以Pi/180再乘以6378.2,单位为千米。(此处将地球当做一个球体,半径为6378.2千米)
C=B*pi/180*6378.2  %C即为地点间地理距离矩阵,单位为千米
D=1./C  %D的元素为距离的倒数。即距离数值越小,倒数后构成的权重越大;反之亦然。
D(D==inf)=0  %当矩阵元素为无限大时,将其变为0
%以下行标准化
E=sum(D,2)  %计算各行之和
F=repmat(E,1,14)  %主要应用repmat函数
W=D./F   %W即为行标准化后的地理距离空间权重矩阵
xlswrite('14省反距离矩阵.xlsx',W,'Sheet1')
%-------------------------------------------------分割线--------------------------------------------
%以下为计算经济地理距离空间权重矩阵 Wes的matlab程序。
%主要思想是:通过上一个matlab程序获得行标准化后的地理距离W,现在获得行标准化后的人均实际GDP经济距离矩阵,再将二者相乘再行标准化。
%与一些文章的细节处理不大一样。但我觉得本处理更合理些,因为多了几次行标准化,避免了地理距离和经济距离量级不一样造成的较大影响。
%注意:地理距离不变,但经济距离(很多人使用人均实际GDP的差额表示)是每年都改变的,所以有几年就有几个Wes
%{
选中下面一行,按F9(F9是matlab运行选中程序的快捷键),新建某年(例2003年)30个省(市,区)的人均实际GDPx列向量
x=[] %200330个省(市,区)的人均实际GDP粘贴入x
W=[] %将上一个matlab计算的地理距离空间权重矩阵粘贴入W
%}
x = [10667.40714
8182.65
7735.857143
2158.764286
62646.47143
12087.35714
3056.769231
12715.67143
25304.46429
5394.878571
1654.957143
14505.48571
849.1142857
12207.25
1933.316157
]
y=x %y与x是一样的,这样做是为了后面计算经济距离
for i=1:14
    for j=1:14
        A(i,j)=x(i,1)-y(j,1);  %A中的元素即为2003年对应两个省区市之间人均实际GDP的差值
    end
end
B=abs(A)  %取A元素的绝对值。因为空间权重矩阵考虑的是距离,不是差值大小
C=1./B
C(C==inf)=0
%以下行标准化
D=sum(C,2)  %计算各行之和
E=repmat(D,1,14)  %主要应用repmat函数
We=C./E   %We即为行标准化后的经济距离权重矩阵
Wes1=W.*We  %地理距离倒数点乘经济距离倒数
%以下再行标准化
F=sum(Wes1,2)
G=repmat(F,1,14)
Wes=Wes1./G  
xlswrite('14省经济距离.xlsx',Wes,'Sheet1')
假设有两个属性 A 和 B,六个方案 S1-S6,它们的属性值如下: | | A | B | |----|----|----| | S1 | 3 | 7 | | S2 | 4 | 6 | | S3 | 9 | 4 | | S4 | 2 | 8 | | S5 | 8 | 3 | | S6 | 5 | 5 | 步骤1:标准化矩阵 首先需要对矩阵进行标准化处理,使得每个属性的权重为1,即每个属性的平均值为1。标准化后的矩阵如下: ```matlab A = [3 4 9 2 8 5]; B = [7 6 4 8 3 5]; % 计算归一化矩阵 A_norm = A ./ sqrt(sum(A.^2)); B_norm = B ./ sqrt(sum(B.^2)); % 计算加权归一化矩阵 w1 = 0.6; w2 = 0.4; A_w = A_norm * w1; B_w = B_norm * w2; % 组合成加权归一化矩阵 X = [A_w; B_w]; ``` 步骤2:计算正向和负向理想解 接下来需要计算正向和负向理想解,可以用下面的代码实现: ```matlab % 计算正向理想解 max_A_w = max(A_w); max_B_w = max(B_w); ideal_pos = [max_A_w; max_B_w]; % 计算负向理想解 min_A_w = min(A_w); min_B_w = min(B_w); ideal_neg = [min_A_w; min_B_w]; ``` 步骤3:计算每个方案到正向理想解和负向理想解的距离 通过欧几里得距离计算每个方案到正向理想解和负向理想解的距离: ```matlab % 计算每个方案到正向和负向理想解的距离 pos_dist = sqrt(sum((X - ideal_pos).^2)); neg_dist = sqrt(sum((X - ideal_neg).^2)); ``` 步骤4:计算综合得分 最后需要计算每个方案的综合得分,综合得分越高,说明该方案越优。综合得分的计算公式为: $$score_i=\frac{neg\_dist_i}{pos\_dist_i+neg\_dist_i}$$ ```matlab % 计算综合得分 score = neg_dist ./ (pos_dist + neg_dist); ``` 完整代码如下: ```matlab % 假设有两个属性A和B,六个方案S1-S6 A = [3 4 9 2 8 5]; B = [7 6 4 8 3 5]; % 计算归一化矩阵 A_norm = A ./ sqrt(sum(A.^2)); B_norm = B ./ sqrt(sum(B.^2)); % 计算加权归一化矩阵 w1 = 0.6; w2 = 0.4; A_w = A_norm * w1; B_w = B_norm * w2; % 组合成加权归一化矩阵 X = [A_w; B_w]; % 计算正向理想解 max_A_w = max(A_w); max_B_w = max(B_w); ideal_pos = [max_A_w; max_B_w]; % 计算负向理想解 min_A_w = min(A_w); min_B_w = min(B_w); ideal_neg = [min_A_w; min_B_w]; % 计算每个方案到正向和负向理想解的距离 pos_dist = sqrt(sum((X - ideal_pos).^2)); neg_dist = sqrt(sum((X - ideal_neg).^2)); % 计算综合得分 score = neg_dist ./ (pos_dist + neg_dist); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值