从find函数到嵌套循环

时间:2015-02-20 21:09:55

标签: matlab

  

文件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

但当然,它不起作用。你有什么提示吗?

1 个答案:

答案 0 :(得分:0)

我理解你的数据的方式,你有一个12行(每月一个)和8列(每年一个)的矩阵。 首先,您需要学习从中读取值并为矩阵赋值。 对于从for k = 1:length(table) ... endfor k = 1:length(table)的每个整数值,for循环end运行1length(table)之间的所有代码(此处您应注意{ {1}}为您提供length(table)的最大维度的长度(此处为table - 我猜这不是您想要的))。您可以使用12作为行数,而使用length(table)作为列数,而不是size(table,1)

因此,size(table,2)循环for的每次迭代都是一个数字。如果你只是将一个数字放入一个矩阵中,它将在列向量中更准确地给出矩阵的一个条目k条目,该矩阵的列由彼此叠加的矩阵的列按顺序排列,例如,在您的12x8矩阵条目15中,将是表格第三行和第二列中的条目 - ktable(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可能会为您提供从tablea(k) = mean(table(:,k));元素的任何位置。有许多不同的方法来解决这个问题!我建议您使用代码尝试一次只运行一小段(可以通过选择要运行的行然后按F9来完成)。尝试了解b(k)矩阵是什么(查看find(table>eight_year)的结果,尝试定义一些额外的变量来帮助您。并使用文档来处理您使用的不同函数(选择功能名称并按F1),希望这可以帮助您自己解决问题。

你应该知道,代码中的错误比我提到的更多。有些错误更容易找到,例如当您在Matlab中执行不允许的操作时,它会告诉您,以及它出错的行。但是你的大多数错误实际上都是你计算你想要的东西的地方。所以试着坐下来真正理解你的代码的每一步,然后对你来说将会更容易。