Matlab和Fortran一样,都是列优先的. 与之相反的是C++, 是行优先的.
原因:数学计算里面很多情况下是要将矩阵看成列向量组。
举例:常见的sum和mean函数
sum()函数:默认列优先
B=sum(A) 对于矩阵A进行每列求和
B=sum(A,dim) 如果dim = 1 对于矩阵A进行每列求和
如果dim = 2 对于矩阵A进行每行就和
B=sum(A,'double')
B=sum(A,'native')
B=sum(A,dim,'double')
B=sum(A,dim,'native') 中的doulbe和native都是对于返回数据类型进行特别的说明
B=sum(A(:))是对矩阵进行全矩阵数值求和。
必须注意一点的是,如果你的矩阵数据类型是cell等无法进行直接求和的数据类型,需要对数据进行预处理。我常遇到的是cell2mat(A)。这样,就可以求和了!
mean()函数
M = mean(A)
如果A是一个向量,mean(A)返回A中元素的平均值。
如果A是一个矩阵,mean(A)将其中的各列视为向量,把矩阵中的每列看成一个向量,返回一个包含每一列所有元素的平均值的行向量。
如果A是一个多元数组,mean(A)将数组中第一个非单一维的值看成一个向量,返回每个向量的平均值。
M = mean(A,dim)
对于矩阵,mean(A,1)就是包含每一列的平均值的行向量。
对于矩阵,mean(A,2)就是包含每一行的平均值的列向量。
A = [1 2 3; 3 3 6; 4 6 8; 4 7 7];
mean(A)
ans =
3.0000 4.5000 6.0000
mean(A,2)
ans =
2.0000
4.0000
6.0000
6.0000
mean(A)
当A为向量时,那么返回值为该向量所有元素的均值
当A为矩阵时,那么返回值为该矩阵各列向量的均值
mean(A,2)
返回值为该矩阵的各行向量的均值
MATLAB: bin文件的写入与读取
# matlab生成的bin文件(因为用于C++使用,所以转置保存了。。。)
close all;clear all;clc;
B = randn(5);
fid = fopen('test.bin','wb');
fwrite(fid,B','double');
fclose(fid);
# matlab读取bin
close all;clear all;clc;
fid = fopen('test.bin','rb');
A = fread(fid,[5,5]'double');
fclose(fid);
C++: bin文件的写入与读取
待完成。。。
libsvm3.11+3.20(及以后版本)安装
具体步骤:
1.File->set path ->add with subfolders->加入libsvm-3.11/3.20文件夹的解压路径(就是你下载好的主文件夹路径 里面包含matlab,Python,windows等子文件夹的那个)
2.mex -setup
3.将matlab当前目录切换到 *:****\libsvm-3.20\matlab
make
4.检验安装是否正确
a.如果你装的是libsvm3.11的话
加载数据方法是,训练和预测方法是:
load heart_scale;
model = svmtrain(heart_scale_label,heart_scale_inst);
[predict_label,accuracy] = svmpredict(heart_scale_label,heart_scale_inst,model);
b.如果你装的是libsvm-3.20的话
加载数据方法是,训练和预测方法是:
[heart_scale_label,heart_scale_inst]= libsvmread('heart_scale');
model = svmtrain(heart_scale_label,heart_scale_inst);
[predict_label,accuracy,decision_values] = svmpredict(heart_scale_label,heart_scale_inst,model,1);
之所以有区别是因为在libsvm3.11中的heart_scale的格式是mat,matlab可以直接load的,训练和测试的方法也比较老版。
而在libsvm3.20中heart_scale的数据格式是c++版的,matlab需要转换一下才可以使用,加载数据要用libsvmread函数。