MATLAB 中的基础统计、搜索与排序
在处理数据集时,我们常常需要进行各种统计分析、排序和搜索操作。MATLAB 提供了丰富的函数和工具来帮助我们完成这些任务。本文将详细介绍 MATLAB 中基础的统计函数、集合操作、排序方法以及相关的编程概念。
1. 统计函数
MATLAB 中有许多内置的统计函数,可用于计算数据集的各种统计量。
1.1 最小值和最大值
min
和
max
函数可用于找出数据集中的最小值和最大值,同时还能返回其索引。
>> x = [9 10 10 9 8 7 3 10 9 8 5 10];
>> min(x)
ans =
3
>> max(x)
ans =
10
>> [maxval, maxind] = max(x)
maxval =
10
maxind =
2
对于矩阵,
min
和
max
函数默认按列操作。若要按行查找最小值或最大值,可将维度 2 作为第三个参数传递给函数,第二个参数需为空向量。
>> mat = randint(2,4,[1 20])
mat =
9 10 17 5
19 9 11 14
>> min(mat)
ans =
9 9 11 5
>> [minval, minind] = min(mat)
minval =
9 9 11 5
minind =
1 2 2 1
>> min(mat,[],2)
ans =
5
9
这些函数还可以比较向量或矩阵,并返回对应元素的最小值或最大值。
>> x = [3 5 8 2 11];
>> y = [2 6 4 5 10];
>> min(x,y)
ans =
2 5 4 2 10
1.2 均值
1.2.1 算术均值
算术均值是数据集中所有值的总和除以值的数量,通常称为平均值。在 MATLAB 中,可以通过自定义函数或使用内置的
mean
函数来计算。
% 自定义函数计算均值
mymean.m
function outv = mymean(vec)
% Calculates and returns the mean of a vector
mysum = 0;
for i=1:length(vec)
mysum = mysum + vec(i);
end
outv = mysum/length(vec);
>> x = [9 10 10 9 8 7 3 10 9 8 5 10];
>> mymean(x)
ans =
8.1667
% 使用内置函数计算均值
>> mean(x)
ans =
8.1667
对于矩阵,
mean
函数默认按列计算均值。若要按行计算,可将维度 2 作为第二个参数传递给函数。
>> mat = randint(3,3,[1 10])
mat =
8 9 3
10 2 3
6 10 9
>> mean(mat)
ans =
8 7 5
>> mean(mat,2)
ans =
6.6667
5.0000
8.3333
当数据集中存在异常值(远大于或远小于其他值的数据)时,算术均值可能会受到较大影响。此时,可以在计算均值之前去除最小值和最大值,或者去除数据集中最大和最小的 1% 或 2% 的值。
>> xwithbig = [9 10 10 9 8 100 7 3 10 9 8 5 10];
>> mean(xwithbig)
ans =
15.2308
>> newx = xwithbig(xwithbig ~= min(xwithbig) & xwithbig ~= max(xwithbig))
newx =
9 10 10 9 8 7 10 9 8 5 10
>> mean(newx)
ans =
8.4545
1.2.2 调和均值和几何均值
调和均值的定义为:
[
\frac{n}{\frac{1}{x_1}+\frac{1}{x_2}+\cdots+\frac{1}{x_n}}
]
可以使用匿名函数来计算调和均值。
>> harmhand = @ (x) length(x) / sum ( 1 ./ x);
>> x = [9 10 10 9 8 7 3 10 9 8 5 10];
>> harmhand(x)
ans =
7.2310
几何均值的定义为数据集所有值的乘积的 n 次方根。同样可以使用匿名函数来计算。
>> geomhand = @ (x) prod(x)^(1/length(x));
>> geomhand(x)
ans =
7.7775
Statistics Toolbox™ 中提供了
harmmean
和
geomean
函数来计算调和均值和几何均值,以及
trimmean
函数来去除最高和最低 2% 的数据值后计算均值。
1.3 方差和标准差
方差和标准差用于衡量数据的离散程度。方差的计算公式为:
[
var = \frac{\sum_{i=1}^{n}(x_i - mean)^2}{n - 1}
]
标准差是方差的平方根。在 MATLAB 中,可以使用
var
和
std
函数来计算方差和标准差。
>> shortx = [4 6 1 5];
>> myvar = var(shortx)
myvar =
4.6667
>> sqrt(myvar)
ans =
1.8257
>> std(shortx)
ans =
1.8257
数据越集中,标准差越小;数据越分散,标准差越大。
>> x1 = [9 10 9.4 9.6];
>> mean(x1)
ans =
9.5000
>> std(x1)
ans =
0.4163
>> x2 = [2 17 -1.5 20.5];
>> mean(x2)
ans =
9.5000
>> std(x2)
ans =
10.8704
1.4 众数
众数是数据集中出现次数最多的值。在 MATLAB 中,可以使用
mode
函数来计算众数。
>> x = [9 10 10 9 8 7 3 10 9 8 5 10];
>> mode(x)
ans =
10
如果有多个值出现的频率相同且最高,则较小的值为众数。如果所有值出现的频率都相同,则数据集中的最小值为众数。
>> x = [3 8 5 3 4 1 8];
>> mode(x)
ans =
3
>> shortx = [2 5 1 4];
>> mode(shortx)
ans =
1
1.5 中位数
中位数是排序后数据集中中间位置的值。如果数据集的数量为奇数,则中位数为中间的那个值;如果为偶数,则中位数为中间两个值的平均值。在 MATLAB 中,可以使用
median
函数来计算中位数,该函数会自动对向量进行排序。
>> median([1 4 5 9 12 ])
ans =
5
>> median([1 4 5 9 12 33])
ans =
7
>> median([9 4 1 5 12])
ans =
5
2. 集合操作
MATLAB 提供了多个内置函数来执行向量的集合操作,包括
union
、
intersect
、
unique
、
setdiff
和
setxor
,以及
ismember
和
issorted
函数。
2.1 并集、交集、差集和对称差集
-
union函数返回包含两个输入向量中所有值的向量,且不重复。 -
intersect函数返回两个输入向量中共同包含的值。 -
setdiff函数返回第一个向量中存在但第二个向量中不存在的值。 -
setxor函数返回两个向量中不共同存在的值。
>> v1 = 2:6
v1 =
2 3 4 5 6
>> v2 = 1:2:7
v2 =
1 3 5 7
>> union(v1,v2)
ans =
1 2 3 4 5 6 7
>> intersect(v1,v2)
ans =
3 5
>> setdiff(v1,v2)
ans =
2 4 6
>> setdiff(v2,v1)
ans =
1 7
>> setxor(v1,v2)
ans =
1 2 4 6 7
2.2 唯一值和成员检查
-
unique函数返回集合中的所有唯一值。 -
ismember函数返回一个逻辑向量,指示第一个向量中的元素是否也存在于第二个向量中。 -
issorted函数检查向量是否按升序排序。
>> v3 = [1:5 3:6]
v3 =
1 2 3 4 5 3 4 5 6
>> unique(v3)
ans =
1 2 3 4 5 6
>> ismember(v1,v2)
ans =
0 1 0 1 0
>> issorted(v3)
ans =
0
>> issorted(v1)
ans =
1
3. 排序
排序是将列表按升序或降序排列的过程。MATLAB 提供了多种排序方法,下面介绍选择排序和内置的
sort
函数。
3.1 选择排序
选择排序的基本思想是:每次从未排序的元素中找到最小的元素,将其与未排序部分的第一个元素交换位置,直到整个列表排序完成。
mysort.m
function outv = mysort(vec)
% This function sorts a vector using the selection sort
% Loop through the elements in the vector to end-1
for i = 1:length(vec)-1
low = i;
%Select the lowest number in the rest of the vector
for j=i+1:length(vec)
if vec(j) < vec(low)
low = j;
end
end
% Exchange elements
temp = vec(i);
vec(i) = vec(low);
vec(low) = temp;
end
outv = vec;
使用示例:
>> vec = [85 70 100 95 80 91];
>> vec = mysort(vec)
vec =
70 80 85 91 95 100
3.2 内置的
sort
函数
MATLAB 内置的
sort
函数可以快速对向量或矩阵进行排序。默认情况下,它按升序排序,也可以指定降序排序。
>> vec = [85 70 100 95 80 91];
>> vec = sort(vec)
vec =
70 80 85 91 95 100
>> sort(vec,'descend')
ans =
100 95 91 85 80 70
对于矩阵,
sort
函数默认按列排序。若要按行排序,可将维度 2 作为第二个参数传递给函数。
>> mat
mat =
4 6 2
8 3 7
9 7 1
>> sort(mat) % sorts by column
ans =
4 3 1
8 6 2
9 7 7
>> sort(mat,2) % sorts by row
ans =
2 4 6
3 7 8
1 7 9
3.3 结构体向量的排序
当处理结构体向量时,通常需要根据结构体中的某个特定字段进行排序。下面是一个根据
price
字段对结构体向量进行升序排序的示例。
mystructsort.m
function outv = mystructsort(structarr)
%This function sorts the packages struct
% based on the price field
for i = 1:length(structarr)-1
low = i;
for j=i+1:length(structarr)
if structarr(j).price < structarr(low).price
low = j;
end
end
% Exchange elements
temp = structarr(i);
structarr(i) = structarr(low);
structarr(low) = temp;
end
outv = structarr;
使用示例:
packages = struct('item_no', {123, 456, 587}, 'cost', {19.99, 5.99, 11.11}, 'price', {39.95, 49.99, 33.33}, 'code', {'g', 'l', 'w'});
>> pack_by_price = mystructsort(packages);
>> printpackages(pack_by_price)
还可以编写一个更通用的函数,根据传入的字段名对结构体向量进行排序。
general_pack_sort.m
function outv = general_pack_sort(inputarg, fname)
%This function sorts a vector of package structs
% based on the field name passed as an input argument
if isfield(inputarg,fname)
for i = 1:length(inputarg)-1
low = i;
for j=i+1:length(inputarg)
if eval(['inputarg(' int2str(j) ').' fname]) < eval(['inputarg(' int2str(low) ').' fname])
low = j;
end
end
% Exchange elements
temp = inputarg(i);
inputarg(i) = inputarg(low);
inputarg(low) = temp;
end
outv = inputarg;
else
disp('Sorry, not a correct field name')
outv = [];
end
使用示例:
>> pack_by_price = general_pack_sort(packages,'price');
>> printpackages(pack_by_price)
综上所述,MATLAB 提供了丰富的统计函数、集合操作和排序方法,能够满足我们在数据处理和分析中的各种需求。通过合理运用这些函数和工具,我们可以更加高效地完成数据处理任务。
4. 搜索
在数据集或数据库中搜索特定的值是一项常见的任务。下面介绍两种基本的搜索技术:顺序搜索和二分搜索。
4.1 顺序搜索
顺序搜索是一种简单的搜索算法,它依次检查数据集中的每个元素,直到找到目标值或遍历完整个数据集。以下是一个简单的顺序搜索函数示例:
myseqsearch.m
function found = myseqsearch(vec, key)
% This function performs a sequential search on a vector
found = false;
for i = 1:length(vec)
if vec(i) == key
found = true;
break;
end
end
使用示例:
>> vec = [85 70 100 95 80 91];
>> key = 95;
>> found = myseqsearch(vec, key)
found =
1
4.2 二分搜索
二分搜索是一种更高效的搜索算法,但要求数据集必须是有序的。它通过不断将搜索范围缩小一半,直到找到目标值或确定目标值不存在。以下是一个二分搜索函数示例:
mybinsearch.m
function found = mybinsearch(vec, key)
% This function performs a binary search on a sorted vector
low = 1;
high = length(vec);
found = false;
while low <= high
mid = floor((low + high) / 2);
if vec(mid) == key
found = true;
break;
elseif vec(mid) < key
low = mid + 1;
else
high = mid - 1;
end
end
使用示例:
>> vec = sort([85 70 100 95 80 91]);
>> key = 95;
>> found = mybinsearch(vec, key)
found =
1
4.3 搜索技术对比
| 搜索技术 | 适用情况 | 时间复杂度 |
|---|---|---|
| 顺序搜索 | 数据集无序或规模较小 | $O(n)$ |
| 二分搜索 | 数据集有序且规模较大 | $O(log n)$ |
5. 索引向量
索引向量是一种表示数据顺序的方式,而无需实际对数据集进行排序。通过索引向量,可以按照特定的顺序访问数据集中的元素。
5.1 创建索引向量
可以使用
sort
函数的第二个输出参数来创建索引向量。例如:
>> vec = [85 70 100 95 80 91];
>> [sorted_vec, index_vec] = sort(vec);
>> index_vec
index_vec =
2 5 1 6 4 3
5.2 使用索引向量访问数据
通过索引向量,可以按照排序后的顺序访问原始数据集中的元素。
>> vec(index_vec)
ans =
70 80 85 91 95 100
6. 总结与应用建议
6.1 总结
本文详细介绍了 MATLAB 中基础的统计函数、集合操作、排序方法和搜索技术。统计函数可以帮助我们计算数据集的各种统计量,如均值、方差、标准差等;集合操作可以对向量进行并集、交集、差集等操作;排序方法可以将数据集按升序或降序排列;搜索技术可以在数据集中查找特定的值。
6.2 应用建议
-
统计分析
:在进行数据分析时,首先使用统计函数计算数据集的基本统计量,了解数据的分布特征。如果数据集中存在异常值,可以考虑使用
trimmean函数去除部分极端值后再计算均值。 - 集合操作 :当处理多个数据集时,使用集合操作函数可以方便地找出数据之间的关系,如共同元素、差异元素等。
-
排序和搜索
:对于小规模数据集,可以使用简单的排序和搜索算法;对于大规模数据集,建议使用内置的高效函数,如
sort和二分搜索,以提高处理效率。
6.3 未来展望
随着数据量的不断增加和数据分析需求的不断提高,MATLAB 可能会提供更多更强大的统计分析、排序和搜索工具。同时,结合机器学习和深度学习技术,MATLAB 在数据分析领域的应用前景将更加广阔。
在实际应用中,我们可以根据具体需求选择合适的函数和方法,灵活运用这些技术,以实现高效的数据处理和分析。希望本文能对大家在 MATLAB 中的数据处理工作有所帮助。
mermaid 流程图示例:
graph TD;
A[开始] --> B[选择操作类型];
B --> C{统计分析};
B --> D{集合操作};
B --> E{排序};
B --> F{搜索};
C --> C1[计算均值];
C --> C2[计算方差];
C --> C3[计算标准差];
D --> D1[求并集];
D --> D2[求交集];
D --> D3[求差集];
E --> E1[选择排序];
E --> E2[内置 sort 函数排序];
F --> F1[顺序搜索];
F --> F2[二分搜索];
C1 --> G[结束];
C2 --> G;
C3 --> G;
D1 --> G;
D2 --> G;
D3 --> G;
E1 --> G;
E2 --> G;
F1 --> G;
F2 --> G;
超级会员免费看
9

被折叠的 条评论
为什么被折叠?



