案例1:
请将每行信息重新格式化为“姓名, 电话号码, 电子邮件”的字符向量形式,并保存到元胞数组s中(注意,第二行有一个vip1的额外备注,这个备注不需要出现在s中);接下来使用换行符连接s中的各行,得到字符向量ss,并输出ss。s1为:
'王大锤 18612345678@xyz.com 18612345678 ' ' 16565432198 lvbu66666@qq.com 吕奉先 (vip1) ' ' 清风 qingfeng_69999@sina.com 15522334455 ' 'liu_liuliu@hust.edu.cn 胡桃 027-66668888 ' '东皇太一 5566dhuang@wzry.com 010-87654321 '
load data_5_3_3.mat
S = { };
s = strtrim(cellstr(s1))
for i = 1:length(s)s_1 = strsplit(s{i}) %把每行拆分成三个元胞数组s_2 = cell(1,3) %空的元胞数组,储存每行排列好的数据for j = 1:length(s_1) s_3 = s_1{j}if all(isletter(s_3))s_2{1} = s_3elseif sum(isstrprop(s_3,'digit'))==11 && ~any(s_3 =='@')s_2{2} = s_3elseif any(s_3 =='@')s_2{3} = s_3endend S{i} = strjoin(s_2,' , ')
end
S
SS = strjoin(S,'\n')
案例2:
假设你是你们班的班长,你需要了解班上同学的兴趣爱好,以便更好地组织活动和建立兴趣小组。现在你收集了 40名同学的兴趣爱好信息,并记录在元胞数组s2中。s2中每个数据都是字符向量,包含由中文顿号分隔的多个兴趣爱好,部分同学的兴趣列表中包含了“其他”作为一个额外的选项。
请你求出任意两名同学共有的兴趣爱好数量,并将结果保存到大小为40行40列的矩阵num 中,其中 num(ii, jj)表示第ii名同学和第ji名同学的共同爱好数量。显然,num 是一个对称矩阵,即 num(jj, ii)和 num(ii,jj)的结果相同。(注意:统计不同同学的兴趣爱好时,可以忽略“其他”这个选项,因为它可能涵盖的兴趣范围过于广泛)
load('data_5_3_3.mat')
n = length(s2);
num = zeros(n);
for ii = 1:nfor jj = 1:iiif ii == jjnum(ii,jj) = length(strsplit(s2{ii},'、'));elses_ii = strsplit(s2{ii},'、');s_jj = strsplit(s2{jj},'、');g = intersect(s_jj,s_ii);g(strcmp(g,'其他')) = [];num(ii,jj) = length(g);num(jj,ii) = length(g); endend
end
num
案例3:
变量s3中保存着2023年高教社杯全国大学生数学建模竞赛获奖名单,它是个长度为59993 的字符向量。我们的目标是统计获得本科组一等奖的 299支队伍中,各地区的数量和出现的频率。请将结果保存到元胞数组c中,c有三列:第一列为各地区的名称,第二列为各地区获得本科组一等奖的队伍数量,第三列为相应的频率(即各地区获得一等奖的队伍数量除以获得本科组一等奖的所有队伍数量 299)。此外,请根据获奖数量将元胞数组c按照降序排列,即获奖数量多的地区应排在前面,并将排序后的结果保存在元胞数组cc中。
load('data_5_3_3.mat');
s = strsplit(s3,newline)';
ss = s(14:316); %提取需要的数据
ydj = cell(299,1); %初始化一个存储一等奖的元胞数组
j = 0; %新索引号
for i =1:length(ss)tem = ss{i};if isstrprop(tem(1),'digit')j = j + 1;ydj{j} = tem;elseydj{j} = [ydj{j},tem];end
end
dq = cell(299,1); %初始化地区的元胞数组
for i = 1:length(ydj)tem = strsplit(ydj{i}); %按空格拆分一等奖的每行信息,发现第三列是地区dq{i} = tem{3}; %将第三列储存在地区元胞数组中
end
dq
% tabulate函数需要统计和机器学习工具箱Statistics and Machine Learning Toolbox
c = tabulate(dq)
cc = sortrows(c,2,'descend')
拓展:tabulate
x1 = randi([-5,3],1,6)
tabulate(x1)
t1 = tabulate(x1) %数值型升序排列x2 = {'yes','no','yes','yes','and'};
tabulate(x2)
t2 = tabulate(x2) %字符型按照出现的顺序排列x3 = [5 2 4 4 5 5 100];
tabulate(x3) %会将1-5的数字全部计算频数,没出现的是0
tabulate(string(x3)) %将数值型转成字符型,这样就会按照出现的顺序排列
tabulate(categorical(x3))%转换为分类数组x = {'yes','no','yes','yes','and','no','or'};
% 使用unique函数找出x中的唯一值,同时获得每个元素在唯一值数组中的索引ind
[Value, ~, ind] = unique(x,'stable') % 加'stable'保持原文本出现的先后顺序
ind == 1:length(Value)
Count = sum(ind == 1:length(Value)) % 计算每个唯一值在x中出现的次数
Percent = Count/sum(Count)*100 % 计算每个唯一值出现的百分比
t = cell(length(Value),3) % 初始化一个元胞数组用于保存最终结果
% 将Value、Count和Percent的值分别填充到元胞数组t的相应位置
t(:,1) = Value % 第一列保存唯一值(这里可以不对Value转置,大小匹配就行)
t(:,2) = num2cell(Count) % 第二列保存每个值的计数
t(:,3) = num2cell(Percent) % 第三列保存每个值的百分比
disp(t) % 输出结果t
% 和内置函数的结果相同
t2 = tabulate(x)
isequal(t,t2)
[t{:,3}] - [t2{:,3}] %浮点数计算误差