目录
MATLAB基础
程序一:imread、imshow、max、min
data=imread('..\data\data1\fig.jpg');
imshow(data)
min(data(:)) % 0
max(data(:)) % 247
disp(max(data(:)));
data=data/2;
max(data(:)) % 124
imshow(data)
解析:
- 图像读取
data = imread('E:\ABCPhoto\practice\fig.jpg');
- 图片的显示
imshow(data)
max(data(:))
表示data中的所有数值都参与运算;a = data(:,:,1)
中a表示data中的第一波段;max(a(:))
表示计算第一波段中的最大值;
注意:
- 图片的名称并不是fig.jpg,而是fig,后面的后缀是图片的格式
- 若不想再MATLAB中将所有像元信息列出来,可以在末尾添加一个
;
- 将矩阵转换为向量,用
:
- 将向量转换成矩阵,用
reshape
imwrite(data, '..\tmp\fig.jpg');
imwrite(data, '..\tmp\fig.tif');
help imread // 帮助文档,查看书写格式
help imwrite
Menu: Help > Product Help > imread
解析:
imwrite
可以存储与书写数据,最后.jpg
与.tif
可以换成想要的格式help imread/imwrite
等命令可以查看帮助文档;或者直接在菜单栏中找到帮助窗口
cd 'D:\tmp' % Change current working directory
a=1:5
b=6:10
c=11:15
d=16:20
e=21:25
data=[a;b;c;d;e] or data=[a,b,c,d,e] or data=[a b c d e]
dlmwrite('data.csv', data)
clear // 清空变量区的变量值
type: help dlmwrite or dlmwrite
解析:
cd
转换工作文件夹- a~e是按顺序排列的五个数
- data的拼接形式,第一种为上下拼接,第二种与第三种为左右拼接
csv
是 Comma Separated Values的缩写。dlmwrite
书写数据的时候可以用不同分隔符。若如上书写,则分隔符为,
。若写成dlmwrite('data.csv',data,'\t')
,则如下框中所示:clear
:清除所有变量与内存;clc
:清除屏幕而不清除内存
>>data = [a;b;c;d;e]
data =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
>>data = [a,b,c,d,e] or data=[a b c d e]
列 1 至 15
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
列 16 至 25
16 17 18 19 20 21 22 23 24 25
data=dlmread('..data\data1\data.csv’)
- 读的是excel、asc、csv等
- 读写图片用imread、imwrite
dlmwrite('data1.csv',data)
dlmwrite('data2.txt',data*2)
dlmwrite('data2.asc',data / 2)
解析:
.csv
、.txt
、.asc
均是文件存储的格式;
计算均值、方差、标准差
Matlab读取excel文件中的数据
啊这?噗,那换一下换一下
xlsread is not recommended. Use readtable, readmatrix, or readcell instead. For more information, see Compatibility Considerations.
data = readmatrix('E:\MATLAB\math-geo\data.xlsx') // 想要确定输出矩阵中小数点精度,不知道怎么弄
data1 = mean(data) // 按矩阵计算,算出了每一列的均值
data2 = mean(data(:)) // 将矩阵转换成向量,算出了所有了数的均值
// 可以进行套娃
mean(data(:)) = mean(mean(data))
- MATLAB中使用的
var()
函数定义的是样本方差,分母除的是(n-1) - MATLAB中使用的
std()
函数定义的是样本标准差,分母除的是(n-1)
归一化
洛伦兹曲线
1.cumsum()
可计算向量、矩阵、逻辑值。矩阵中可按行计算也可按列计算。
2.linspace()
线性等分向量。
3.interp1()
插值。
4.trapz()
计算基尼系数,梯形数值积分。
语法:
Q = trapz(Y)
Q = trapz(X,Y)
Q = trapz(___,dim)
说明:
Q = trapz(Y) 通过梯形法计算 Y 的近似积分(采用单位间距)。Y 的大小确定求积分所沿用的维度:
- 如果 Y 为向量,则 trapz(Y) 是 Y 的近似积分。
- 如果 Y 为矩阵,则 trapz(Y) 对每列求积分并返回积分值的行向量。
- 如果 Y 为多维数组,则 trapz(Y) 对其大小不等于 1 的第一个维度求积分。该维度的大小变为 1,而其他维度的大小保持不变。
Q = trapz(X,Y) 根据 X 指定的坐标或标量间距对 Y 进行积分。
- 如果 X 是坐标向量,则 length(X) 必须等于 Y 的大小不等于 1 的第一个维度的大小。
- 如果 X 是标量间距,则 trapz(X,Y) 等于 X*trapz(Y)。
Q = trapz(___,dim) 使用以前的任何语法沿维度 dim 求积分。必须指定 Y,也可以指定 X。如果指定 X,则它可以是长度等于 size(Y,dim) 的标量或向量。例如,如果 Y 为矩阵,则 trapz(X,Y,2) 对 Y 的每行求积分。
5.cftool()
拟合曲线。
6.画图去掉右侧与上侧的刻度。
box off
ax2 = axes('Position',get(gca,'Position'),...
'XAxisLocation','top',...
'YAxisLocation','right',...
'Color','none',...
'XColor','k','YColor','k');
set(ax2,'YTick', []);
set(ax2,'XTick', []);
box on
7.去掉标注周围的黑框,用legend('boxoff')
。
8.再已经完成的图像上加点方法:
(1)Figure的Brush/Select Data功能。(为尝试)
(2)
hold on;
plot(1000,200,’.’,‘MarkerEdgeColor’,‘k,‘MarkerSize’,16);
在图中(x,y)坐标为(1000,200)画一个黑色的点。其中:’.'是点的形状;‘MarkerEdgeColor’是定义点的颜色,这里’k’是黑色;‘MarkerSize’是定义点的大小。
(3)可添加一组数据进去。或许一个点不知道可不可以。
hold on
scatter(x,y);
(4)gtext(’(x,y)’);
9.限定x轴y轴范围:axis([xmin xmax ymin ymax])
。只限定y轴ylim([ymin ymax])
。
主成分分析
变量与样本
% 数据标准化并计算相关系数
mv=mean(data,1); % 计算各变量的均值
st=std(data); % 计算各变量的标准差
[n m]=size(data); % 计算矩阵的函数和列数
X=(data-mv(ones(n,1),:))./st(ones(n,1),:); % 原始数据集体标准化
R=corrcoef(X); % 计算相关系数矩阵
% 主成分分析的完整计算过程
[U,V]=eig(R); % 计算特征向量U和特征值矩阵V
E=transpose(rot90(U)); % 将特征向量矩阵U旋转90度再转置
G=rot90(rot90(V)); % 将对角矩阵旋转180度
eigv=diag(G); % 提取对角矩阵的对角线元素
per=100*eigv/sum(eigv); % 计算方差贡献百分比
Cum=cumsum(per); % 计算方差贡献累积百分比
C=sqrtm(G); % 将对角矩阵对角线元素化为平方根
A=E*C; % 计算载荷矩阵
H=A(:,1:3); % 提取第一、第二、第三主成分的载荷
遥感影像
1.随机生成三维的矩阵,a=rand([3,2,3]);
2.按列计算平均值mean(a(:,1));
,按行计算平均值mean(a(:,2));
,按像元计算平均值mean(a(:,3));
,按波段计算平均值mean(mean(a));
3.计算每个波段的标准差
A(:,:,1)=[2 4; -2 -1];
A(:,:,2)=[9 13; -5 7];
A(:,:,3)=[4 4; 8 -3];
S=std(A,0,[1 2])
S =
S(:,:,1) =
2.5000
S(:,:,2) =
7.7460
S(:,:,3) =
4.5735
随堂笔记
多元统计
1.两个%%加一个空格,可以将文本分区。
2.一般开头都用clear all; clc
原因:避免别的元素造成干扰。
3.用于做回归的函数regress
。去help看一下。
help 函数 在MATLAB中打开;
helpwin 函数 在windows中打开;
edit 函数 打开函数的具体代码。
4.当不想要函数输出的某些量,但需要得到后面的变量,可以打~。如[a,b,~,~,c]=regress(Y,X)
。
5.ctrl+c,打断命令。
6.plot(X(:,2),1,'o-')
,最右边的'o-'
的意思,会在图形上显示有圈圈。plot(Y,'v-')
这个会在图片上显示三角形,因此黑白打印时能区分曲线。画图时有颜色与形状区分。可双击图片对显示进行设置。对图像进行操作时,可右键显示代码,得到代码。
7.hold on,可在两条曲线画图的时候,先画一条,然后停下来,再继续画另一条。figure能显示图片,若没有figure,结果显示会被覆盖。
8.有很多图的时候,用close all关掉全部
8.ones(9,1)
九行一列的1,2*ones(9,1)
九行一列的2,zeros(9,1)
九行一列的0。
9.函数importdata
,
遥感图像处理
1.计算协方差矩阵cov(data);
2.计算特征向量与特征值[V,D]=eig(cov(data));
,对协方差矩阵求特征值和特征向量。根据D中的值大小进行排序;V是所求的旋转矩阵。
3.计算相关系数corr(data);
4.表示逆矩阵inv(data);
数量地理学
指数换数拟合
1.plotfit()
:进行多项式拟合。其数学原理
图像增强
1.*
与.*
的区别:
(1)在进行数值运算和数值乘矩阵的时候,没有区别。
(2)矩阵和矩阵运算时,
*
表示普通的矩阵乘法,要求前面矩阵的列数等于后面矩阵的行数;
.*
表示两个矩阵对应元素相乘,要求两个矩阵行数列数都相等。
例如A,B分别为两个矩阵,则:
A.*B
表示的是两个矩阵的对应元素相乘,其中生成的同阶矩阵C的对应的矩阵元素为:C(i,j)=A(i,j)*B(i,j)
;而如果A*B的话,则是正常的矩阵相乘,并非是对应的元素相乘。
>> a=[1 1 ; 1 1]
a=
1 1
1 1
>>a^2
ans=
2 2
2 2
>>a.^2
ans=
1 1
1 1
2.除与点除
(1)数值运行时,两种没有区别。
(2)数值与矩阵运算时,要分数值在前还是在后。
a.数值在前,只能用./
。
b.数值在后,两者相同。
(3)矩阵与矩阵运算时,对应元素相除,要求两者行数列数相等。
(4)矩阵除矩阵,A/B
可粗略地看作A*inv(B)
;
在可逆形式下转换成逆矩阵,右除对右边矩阵逆,左除对左边矩阵逆。
a.C/B=C*(inv(B))
(C右除B等于C乘以B的逆)
b.A\C=inv(A)*C
(A左除C=A的逆乘以C)
3.fspecial()
:create predefined 2-D filter.
h = fspecial(type)
h = fspecial('average',hsize)
h = fspecial('disk',radius)
h = fspecial('gaussian',hsize,sigma)
h = fspecial('laplacian',alpha)
h = fspecial('log',hsize,sigma)
h = fspecial('motion',len,theta)
h = fspecial('prewitt')
h = fspecial('sobel')
4.imfilter()
:N-D filtering of multidimensional images.
B = imfilter(A,h)
B = imfilter(A,h,options,...)
5.imnoise()
(1)要将数值限制在0-1之间。
6.两数平方和再开方:p=sqrt(double(p1).^2+double(p2).^2);
多光谱转换
1.pca()
:MATLAB自带主成分分析函数。
2.显示RGB:432波段。
ims=multibandread(input,[nrows ncols bands],'uint8',offset,interleave,byteorder,{'Band','Direct',[4 3 2]});
ims=multibandread(input,[nrows ncols bands],'uint8',offset,interleave,byteorder);
imgmul=cat(3,ims(:,:,4),ims(:,:,3),ims(:,:,2)); % 合成三维矩阵
imshow(uint8(imgmul))
3.repmat()