我有一个1981年到2000年的专栏,相当于一个商品的另一列价格。我试图制作一个循环,只循环从1990年到2000年的几年,并打印价格与他们的年份相关的顺序。到目前为止我有这个代码,但我不确定为什么它不会运行,任何帮助都会很棒。
for x=1:year == 1990:2000
v = find(isfinite(price));
v
end
答案 0 :(得分:0)
如果您的输入数据是这样的,其中第一列是年,第二列是价格
data = [1990, 2.50;
1991, 3.00;
...
2000, 4.00];
您可以循环使用for循环中的年份(请注意语法以及它与您帖子中的语法相比),然后使用logical indexing找到价格与该年份相对应的第二列。
for year = 1990:2000
% Grabs column 2 where column 1 is equal to the year
price = data(data(:,1) == year, 2);
end
即使您的数据存在于两种不同的数据结构中,您也可以执行类似的操作(只要它们的大小相同)。
years = [1990, 1991, 1992, ... 2000];
prices = [2.50, 3.00, 3.50, ... 4.00];
for year = 1990:2000
price = prices(years == year);
end
修改强>
如果你是for-loop averse,你可以在没有for循环的情况下明确地做同样的事情。最强大的解决方案是使用arrayfun
。
annualPrices = arrayfun(@(x)prices(years == x), years, 'uniform', 0);
这将返回一个单元格数组,其中每个元素都是给定年份的所有价格。
但是,如果您保证每年只有一个价格,则可以省略uniform
输入,并获得一系列价格。
annualPrices = arrayfun(@(x)prices(years == x), years);
其中一个好处是这些方法都不需要对数据进行额外的操作(例如排序)。
答案 1 :(得分:0)
示例1:
让我们制作一个包含数据的矩阵:
M = ones(100,2); % 1st column for the year and the second column for the prices
M(:,1) = (1951:2050).';
M(:,2) = rand(100,1);
您问题的一个内容可以如下:
M((M(:,1)<= 2000 & M(:,1) >= 1990),2)
示例2:
如果您有两个向量的价格和年份,请首先确保您的年份已分类:
[sortedYears,Idx] = sort(years); % sort the years vector
sortedPrices = prices(Idx); % use the index to sort the prices in the same order
现在使用以下一个班轮:
sortedPrices((sortedYears<= 2000 & sortedYears >= 1990));