文件lake_powell.dat包含2000年至2007年8年内水库水位的数据。这些数据见表8.9。使用文件中的数据回答以下问题: (a)确定每年和收集数据的8年期间的平均水位。 (b)确定每年有多少个月超过8年期间的总体平均数。 (c)创建一份报告,列出超过总体平均值的每个月的月份(数量)和年份。例如,6月是6月。 (d)确定8年期间每个月的平均海拔高度。
最初,当我学习查找功能时,我遇到了这个问题。为此,我得到了答案:
load LAKE_POWELL.DAT
% part a
table=[LAKE_POWELL]; % Puts LAKE_POWELL.DAT into a table
yearly=mean(table) % Finds the average elevation of the water level for each year
eight_years=mean(table(:)) % Puts the values of the matrix into one column vector before finding the average the entire matrix
% part b
l=[eight_years] % Puts averages into matrix
i=mean(table) % Finds overall average of data
[y]=(find(table>i)) % Finds which months are above overall average
% part c
fprintf('Month # %f in year %f exceeds overall average',y,column) % Creates a report that lists the month and the year for each of the months that exceed the overall average
% part d
months=table'; % Transposes the table so that the months are now columns
per_month=mean(months) % Determines the average elevation of the water for each month
但现在我被告知我需要解决相同的问题,但是嵌套循环。到目前为止,我有:
load LAKE_POWELL.DAT
table=[LAKE_POWELL];
for k=1:length(table)
a=mean(table(k))
eight_year=mean(a)
b=zeros(1,length(table))
for k=1:length(table)
b(k)=find(table>eight_year)
end
end
但当然,它不起作用。你有什么提示吗?
答案 0 :(得分:0)
我理解你的数据的方式,你有一个12行(每月一个)和8列(每年一个)的矩阵。
首先,您需要学习从中读取值并为矩阵赋值。
对于从for k = 1:length(table) ... end
到for k = 1:length(table)
的每个整数值,for循环end
运行1
和length(table)
之间的所有代码(此处您应注意{ {1}}为您提供length(table)
的最大维度的长度(此处为table
- 我猜这不是您想要的))。您可以使用12
作为行数,而使用length(table)
作为列数,而不是size(table,1)
。
因此,size(table,2)
循环for
的每次迭代都是一个数字。如果你只是将一个数字放入一个矩阵中,它将在列向量中更准确地给出矩阵的一个条目k
条目,该矩阵的列由彼此叠加的矩阵的列按顺序排列,例如,在您的12x8矩阵条目15中,将是表格第三行和第二列中的条目 - k
与table(15)
相同(当表格具有这些维度时)。
要获取整行或整列,您需要使用向量索引或使用table(3,2)
- 运算符。这很容易完成::
为您提供表格的table(i,:)
行,i
为您提供表格的table(:,j)
列。您对j
行所做的工作是将a=mean(table(k))
设置为a
的{{1}}条目的平均值(即单个数字的平均值 - 所以{{ 1}})。您可能要做的是将k
的{{1}}条目设置为table
a = table(k)
的{{1}}列的平均值:k
。然后下一行是正确的,除了你计算每个步骤到目前为止的结果的平均值,而不是在完成其他计算之后计算一次平均值。
现在我们到了问题b。首先,正如在评论中所解释的那样,你不应该在嵌套循环中使用与循环变量相同的变量! Matlab会允许它,但你很可能从计算中得到错误的结果!
您收到错误的原因是a
是对向量中单个条目的引用,而k
可能会为您提供从table
到a(k) = mean(table(:,k));
元素的任何位置。有许多不同的方法来解决这个问题!我建议您使用代码尝试一次只运行一小段(可以通过选择要运行的行然后按F9来完成)。尝试了解b(k)
矩阵是什么(查看find(table>eight_year)
的结果,尝试定义一些额外的变量来帮助您。并使用文档来处理您使用的不同函数(选择功能名称并按F1),希望这可以帮助您自己解决问题。
你应该知道,代码中的错误比我提到的更多。有些错误更容易找到,例如当您在Matlab中执行不允许的操作时,它会告诉您,以及它出错的行。但是你的大多数错误实际上都是你计算你想要的东西的地方。所以试着坐下来真正理解你的代码的每一步,然后对你来说将会更容易。