为什么在matlab 2022中执行以下代码时,daxiaobi表是空的?% 读取Shuju表格中的数据并保存胸径数据到xiongj表格 shuju = readtable('Shuju.xlsx'); xiongj = table(shuju{:, 4}, 'VariableNames', {'xiongj'}); % 获取中心树的胸径数据 writetable(xiongj, 'xiongj.xlsx'); % 读取zyshu表格,并依次读取最近的4棵树的胸径数据到xiongj表格 zyshu = readtable('zyshu.xlsx'); for i = 1:size(zyshu, 1) for j = 2:5 idx = zyshu{i, j}; xiongj{i, j} = shuju{idx, 4}; end end writetable(xiongj, 'xiongj.xlsx'); % 遍历xiongj表格,比较每一行的胸径数据,并计算比较结果的平均值 daxiaobi = zeros(size(xiongj,1),2);%创建一个和xiongj一样大小的数组,用来保存结果 sum_val=0; for i = 1:size(xiongj, 1) row_val = xiongj{i, 2:end}; %取要比较的各列的值,xiongj{i, 2:end}是一个行向量 n = length(row_val); %取列的个数 if all(xiongj{i, 1} <row_val) %判断当前行的第一个元素是否小于row_val向量中的元素,若小于则计数器sum_val加1 sum_val=sum_val+1; end daxiaobi{i,2} = sum_val / n; end % 保存daxiaobi表格 writetable(daxiaobi, 'daxiaobi.xlsx'); % 在命令行窗口输出daxiaobi表格 disp(daxiaobi);
时间: 2024-03-11 12:43:46 浏览: 101
在Matlab 2022中执行该代码时,daxiaobi表格为空是因为在第14行中,`xiongj`表格是先写入了文件'xiongj.xlsx',但是在第19行时重新从文件中读取了`xiongj`表格,这时`xiongj`表格已经被修改了,导致第27行中`daxiaobi`表格的计算出现问题。解决方法是在第19行中不再从文件中读取`xiongj`表格,而是直接使用第14行中的`xiongj`表格,即将第19行改为`for i = 1:size(xiongj, 1)`。另外,在第25行中,`daxiaobi`表格的列数定义为2,但是只有第二列有值,应该改为将计算结果赋值给第一列,即将第25行改为`daxiaobi{i,1} = sum_val / n;`。
相关问题
为什么以下这一段代码在matlab 2022中执行时报错% 读取Shuju表格中的数据并保存胸径数据到xiongj表格 shuju = readtable('Shuju.xlsx'); xiongj = table(shuju{:, 4}, 'VariableNames', {'xiongj'}); % 获取中心树的胸径数据 writetable(xiongj, 'xiongj.xlsx'); % 读取zyshu表格,并依次读取最近的4棵树的胸径数据到xiongj表格 zyshu = readtable('zyshu.xlsx'); for i = 1:size(zyshu, 1) for j = 2:5 idx = zyshu{i, j}; xiongj{i, j} = shuju{idx, 4}; end end writetable(xiongj, 'xiongj.xlsx'); % 遍历xiongj表格,比较每一行的胸径数据,并计算比较结果的平均值 daxiaobi = zeros(size(xiongj,1),2);%创建一个和xiongj一样大小的数组,用来保存结果 sum_val=0; for i = 1:size(xiongj, 1) row_val = xiongj{i, 2:end}; %取要比较的各列的值 n = length(row_val); %取列的个数 if xiongj{i, 1} <row_val %判断当前行的第一个元素是否小于row_val向量中的元素,若小于则计数器sum_val加1 sum_val=+1; end daxiaobi{i,2} = sum_val / n; end % 保存daxiaobi表格 writetable(daxiaobi, 'daxiaobi.xlsx'); % 在命令行窗口输出daxiaobi表格 disp(daxiaobi);
在Matlab 2022中执行该代码时报错,是因为在第16行中的计数器`sum_val`的自增操作写成了`sum_val=+1`,应该改为`sum_val = sum_val + 1`,否则`sum_val`的值始终为1,导致计算结果错误。另外,在第21行中,应该使用逐一比较的方式比较向量中的元素,而不是直接比较两个向量是否相等,可以使用`all`函数实现向量的逐一比较,改为`if all(xiongj{i, 1} < row_val)`即可。
用matlab 2022将下列步骤编写为一段完整的代码: 1、存在一个名称为Shuju的EXCEL表,表中第1列是中心树的顺序编号,第2列是中心树的x坐标,第3列是中心树的y坐标,第4列是中心树的胸径数据,第5列是中心树的种类。 2、存在一个名称为zyshu的excel表,表中第1列是中心树的顺序编号,第2列是离中心树最近的第1棵树的编号,第3列是离中心树最近的第2棵树的编号,第4列是离中心树最近的第3棵树的编号,第5列是离中心树最近的第4棵树的编号。 3、根据中心树编号,在名称为Shuju的EXCEL表中,读取该编号对应的中心树的胸径数据,保存在名称为xiongj的excel表的第1列中。 4、根据名称为zyshu的excel表中,第2、3、4、5列中的编号,依次从该编号对应的名称为Shuju的EXCEL表中读取出该编号对应的胸径数据,保存在名称为xiongj的excel表的第2、3、4、5列中。 5、在名称为xiongj的excel表中,遍历每一行,并顺序编号,将编号依次保存在名称为daxiaobi的excel表的第1列中。依次比较名称为xiongj的excel表中每1行的第1列与第2、3、4、5列的数据值大小,当第1列的数值小于其他列的数据值时,变量赋值为1,否则赋值为0。比较完一行后,取变量赋值和的平均值,将值保存在名称为daxiaobi的excel表中每1行的第2列中。 6、保存名称为daxiaobi的excel表,运行后在命令行窗口输出名称为daxiaobi的excel表中数据。
以下是代码实现:
% 1. 读取名称为Shuju的EXCEL表
shuju = readtable('Shuju.xlsx');
% 2. 读取名称为zyshu的excel表
zyshu = readtable('zyshu.xlsx');
% 3. 根据中心树编号,读取胸径数据保存在名称为xiongj的excel表的第1列中
xiongj = table(shuju{:, 4}, 'VariableNames', {'xiongj'});
% 4. 依次读取第2、3、4、5列中的编号,读取对应的胸径数据保存在名称为xiongj的excel表的第2、3、4、5列中
for i = 2:5
col_name = strcat('tree', num2str(i-1));
xiongj.(col_name) = shuju{zyshu{:, i}, 4};
end
% 5. 遍历每一行、顺序编号,并将编号依次保存在名称为daxiaobi的excel表的第1列中
daxiaobi = table((1:size(xiongj, 1))', 'VariableNames', {'id'});
% 比较每一行的胸径数据大小,计算变量赋值和的平均值
for i = 1:size(xiongj, 1)
row_val = xiongj{i, 2:end};
n = length(row_val);
sum_val = sum(xiongj{i, 1} < row_val);
daxiaobi{i, 'daxiaobi'} = sum_val / n;
end
% 6. 保存daxiaobi表格
writetable(daxiaobi, 'daxiaobi.xlsx');
% 在命令行窗口输出daxiaobi表格
disp(daxiaobi);
阅读全文