27、MATLAB 中的基础统计、搜索与排序

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值