鱼C论坛

 找回密码
 立即注册
查看: 1300|回复: 2

matlab题

[复制链接]
发表于 2023-11-1 22:15:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
(1)读入Ex_C1to5StaData2023.xls,将文件中C1~C5站的水质监测数据及相关信息
%   处理成一个结构体StaData,并将StaData保存至Ex07_StaC1toC52023.mat;
%   StaData应为一个1*5大小的数组(如下所示),利用循环语句进行创建:
%
% >> StaData
% StaData =
%
% 1x5 struct array with fields:
%
%     sn
%     year
%     month
%     day
%     hour
%     oxy
%     T
%     S
%     pH
%     BOD5
%     NO3
%     lon
%     lat
%
% >> StaData(3)
%        sn: 'C3'
%      year: [40x1 double]
%     month: [40x1 double]
%       day: [40x1 double]
%      hour: [40x1 double]
%       oxy: [40x1 double]
%         T: [40x1 double]
%         S: [40x1 double]
%        pH: [40x1 double]
%      BOD5: [40x1 double]
%       NO3: [40x1 double]
%       lon: 113.7220
%       lat: 22.3320
%
% (2)导入(1)生成的mat文件,基于结构体StaData求出各站点的各类水质指标的
%   平均值,将结果写入Ex07_C1toC5Means.txt文件中,参考格式如下:
%
% C5       oxy         S         T        pH      BOD5       NO3
%         3.72     20.78     16.62      5.26      1.14      0.74
% C4       oxy         S         T        pH      BOD5       NO3
%         4.26     24.40     19.52      5.99      1.34      0.86
% C3       oxy         S         T        pH      BOD5       NO3
%         5.04     27.80     22.12      6.90      1.50      1.00
% C2       oxy         S         T        pH      BOD5       NO3
%         5.47     31.72     24.72      8.00      1.74      1.10
% C1       oxy         S         T        pH      BOD5       NO3
%         6.31     34.84     27.80      8.76      1.88      1.23
%
% (要求:利用循环结构对各个水质变量进行批量处理;观察其规律性,思考如何利用
%   sprintf以及eval使得求值更为简便).
%
% (3)读取(2)生成的txt文件中的数据,计算出各水质指标的平均值(即将5个站点
%  进行平均).具体输出格式如下:
%
%   oxy mean: 4.9600
%     S mean: 27.9080
%     T mean: 22.1560
%  ...
% (提示:可采用fgetl+textscan/sscanf/str2num)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-1 22:16:54 | 显示全部楼层
问题1:

首先,我们需要读取Excel文件并将数据存储到一个结构体数组中。我们可以使用 xlsread 函数来读取Excel文件的数据,并使用循环语句将每个站点的数据存储到结构体数组中。最后,我们可以使用 save 函数将结构体数组保存为.mat文件。
% 读取Excel文件
data = xlsread('Ex_C1to5StaData2023.xls');

% 创建结构体数组
StaData = struct('sn', {}, 'year', {}, 'month', {}, 'day', {}, 'hour', {}, 'oxy', {}, 'T', {}, 'S', {}, 'pH', {}, 'BOD5', {}, 'NO3', {}, 'lon', {}, 'lat', {});

% 循环处理每个站点的数据
for i = 1:5
    StaData(i).sn = ['C', num2str(i)];
    StaData(i).year = data(:, 1);
    StaData(i).month = data(:, 2);
    StaData(i).day = data(:, 3);
    StaData(i).hour = data(:, 4);
    StaData(i).oxy = data(:, 5);
    StaData(i).T = data(:, 6);
    StaData(i).S = data(:, 7);
    StaData(i).pH = data(:, 8);
    StaData(i).BOD5 = data(:, 9);
    StaData(i).NO3 = data(:, 10);
    StaData(i).lon = data(1, 11);
    StaData(i).lat = data(1, 12);
end

% 保存结构体数组为.mat文件
save('Ex07_StaC1toC52023.mat', 'StaData');

问题2:

接下来,我们需要基于结构体数组 StaData 计算各个站点的水质指标的平均值,并将结果写入到一个文本文件中。我们可以使用循环结构对每个水质指标进行批量处理,并利用 sprintf 和 eval 函数来简化求值的过程。
% 打开文本文件
fileID = fopen('Ex07_C1toC5Means.txt', 'w');

% 循环处理每个水质指标
for i = 1:5
    % 获取当前站点的名称
    sn = StaData(i).sn;
    
    % 写入站点名称到文本文件
    fprintf(fileID, '%s\t', sn);
    
    % 循环处理每个水质指标
    variables = {'oxy', 'S', 'T', 'pH', 'BOD5', 'NO3'};
    for j = 1:length(variables)
        variable = variables{j};
        
        % 计算当前指标的平均值
        avg = mean(StaData(i).(variable));
        
        % 将平均值写入文本文件
        fprintf(fileID, '%.2f\t', avg);
    end
    
    % 写入换行符到文本文件
    fprintf(fileID, '\n');
end

% 关闭文本文件
fclose(fileID);

问题3:

最后,我们需要读取文本文件并计算各个水质指标的平均值,即将5个站点进行平均。我们可以使用 fgetl 函数逐行读取文本文件,并使用 textscan 、 sscanf 或 str2num 函数将每行数据解析为数值。然后,我们可以计算每个水质指标的平均值并输出结果。
% 打开文本文件
fileID = fopen('Ex07_C1toC5Means.txt', 'r');

% 初始化水质指标的平均值
means = zeros(1, 6);

% 逐行读取文本文件并计算平均值
line = fgetl(fileID);
while ischar(line)
    % 解析每行数据
    data = sscanf(line, '%s%f%f%f%f%f%f');
    
    % 计算每个水质指标的平均值
    means = means + data(2:end)';
    
    % 继续读取下一行
    line = fgetl(fileID);
end

% 关闭文本文件
fclose(fileID);

% 计算水质指标的平均值
means = means / 5;

% 输出结果
variables = {'oxy', 'S', 'T', 'pH', 'BOD5', 'NO3'};
for i = 1:length(variables)
    fprintf('%s mean: %.4f\n', variables{i}, means(i));
end

希望这些代码能够解决你的问题。如果你还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-1 22:18:19 | 显示全部楼层
解决Matlab题目

(1)读入Ex_C1to5StaData2023.xls,将文件中C1~C5站的水质监测数据及相关信息处理成一个结构体StaData,并将StaData保存至Ex07_StaC1toC52023.mat。StaData应为一个1*5大小的数组,利用循环语句进行创建:

[/code]matlab
% 读取Excel文件
[num, txt, raw] = xlsread('Ex_C1to5StaData2023.xls');
% 初始化结构体
StaData = struct('sn', {}, 'year', {}, 'month', {}, 'day', {}, 'hour', {}, ...
    'oxy', {}, 'T', {}, 'S', {}, 'pH', {}, 'BOD5', {}, 'NO3', {}, ...
    'lon', {}, 'lat', {});
% 遍历5个站点
for i = 1:5
    StaData(i).sn = ['C', num2str(i)];
    % 获取对应站点的数据
    idx = find(strcmp(txt(:, 1), ['C', num2str(i)]));
    StaData(i).year = num(idx, 1);
    StaData(i).month = num(idx, 2);
    StaData(i).day = num(idx, 3);
    StaData(i).hour = num(idx, 4);
    StaData(i).oxy = num(idx, 5);
    StaData(i).T = num(idx, 6);
    StaData(i).S = num(idx, 7);
    StaData(i).pH = num(idx, 8);
    StaData(i).BOD5 = num(idx, 9);
    StaData(i).NO3 = num(idx, 10);
    StaData(i).lon = num(idx(1), 11);
    StaData(i).lat = num(idx(1), 12);
end
% 保存到mat文件
save('Ex07_StaC1toC52023.mat', 'StaData');
[/code]

(2)导入(1)生成的mat文件,基于结构体StaData求出各站点的各类水质指标的平均值,将结果写入Ex07_C1toC5Means.txt文件中:

[/code]matlab
% 导入mat文件
load('Ex07_StaC1toC52023.mat');
% 打开输出文件
fid = fopen('Ex07_C1toC5Means.txt', 'w');
% 定义要处理的字段
fields = {'oxy', 'S', 'T', 'pH', 'BOD5', 'NO3'};
% 遍历每个字段
for f = 1:length(fields)
    field = fields{f};
    % 输出表头
    fprintf(fid, '%s\t', field);
    for i = 1:5
        % 获取对应站点的数据
        data = StaData(i).(field);
        % 计算平均值并输出
        mean_val = mean(data);
        fprintf(fid, '%.2f\t', mean_val);
    end
    fprintf(fid, '\n');
end
% 关闭输出文件
fclose(fid);
[/code]

(3)读取(2)生成的txt文件中的数据,计算出各水质指标的平均值(即将5个站点进行平均)。具体输出格式如下:

[/code]matlab
% 打开输出文件
fid = fopen('Ex07_C1toC5Means.txt', 'r');
% 定义要处理的字段
fields = {'oxy', 'S', 'T', 'pH', 'BOD5', 'NO3'};
% 初始化各字段平均值
means = zeros(length(fields), 1);
% 遍历每个字段
for f = 1:length(fields)
    field = fields{f};
    % 跳过表头
    fgetl(fid);
    % 初始化累加器和计数器
    sum_val = 0;
    count = 0;
    % 遍历每个站点
    for i = 1:5
        % 读取对应站点的数据
        line = fgetl(fid);
        data = str2num(line(4:end));
        % 累加该站点的值
        sum_val = sum_val + data(f);
        count = count + 1;
    end
    % 计算平均值
    means(f) = sum_val / count;
end
% 关闭输出文件
fclose(fid);
% 输出结果
for f = 1:length(fields)
    field = fields{f};
    fprintf('%s mean: %.4f\n', field, means(f));
end
[/code]

球一个最佳答案谢谢啦!这对我非常重要!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 08:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表