遇到一个问题,这里有一个sav格式的数据,300多行,22列,想要计算它的指标权重,怎么办呢?一般的思路就是直接读取相关文件,把它存入一个对象中,然后再通过对该对象进行操作,得出结果。
按照上面的思路也是正确的,没有什么问题,但是,遇到了matlab直接读取sav文件报Unknown text on line number 1 of ASCII file D:\opFiles\weight\bootstrap13.sav
错。那么我是怎么解决这个问题,并且获得我想要的指标权重呢?
由于自己是帮女朋友解决这个问题,但是之前没有弄过matlab代码,也不太懂,也只有从网上百度综合自己对代码的理解,来解决问题。接下来,就详细介绍下:
第一步,进行数据处理 ,将sav文件另存为csv文件,操作步骤如下:
打开sav文件,点击软件的左上角“文件”,然后再点击出现的“另存为”,在弹出的页面中选中“csv”,并保存,保存的结果部分图如下:
第二步,也就是正式编码实现:
读取文件可以直接选择matlab里面的csvread函数进行csv文件的读取,代码如下:
data=csvread('D:\xxxxxxx.csv',1,0);
这里说一下后面的1,0
分别表示什么意思,这里的意思是说从第二行第一列开始读数据(熟悉代码的都知道,我们习惯从1开始计算,但是代码是外国人写的,他们喜欢从0开始计算,直接将我们需要读取的行列值减去1,就得到这里的1,0
了),因为第一行是我们自己写的标题,如果没有写标题参数可写为0,0
,其它的读懂这段话就自己改下就可以了。
数据读取完成后,那么直接使用代码进行计算得出结果,整理后的全部代码如下:
clc;clear;
data=csvread('D:\xxxx.csv',1,0); %其中data为存储数据的对象 1,0按照上面解释根据自己的实际情况改写,很简单,要有耐心看
data(:, 3) = -data(:, 3); %成本型指标转换为效益型
[m, n] = size(data); %获得长宽
for i = 1:n
data(:, i) = (data(:, i) - min(data(:, i)))/(max(data(:, i)) - min(data(:, i)));
end
corr = corrcoef(data); % 计算相关系数矩阵
corr_1 = sum(1 - corr); % 计算冲突性
data_std = std(data); % 计算每列方差
C = data_std .* corr_1; % 计算信息量
w = C./sum(C); % 计算权重
w % 输出结果
看到这里,恭喜你,坚持到最后了,这里得到的部分结果图如下:
注意:欢迎转载,转载时请注明来源