如何循环对应于另一个向量MATLAB的向量

时间:2016-03-06 19:07:43

标签: matlab

我有一个1981年到2000年的专栏,相当于一个商品的另一列价格。我试图制作一个循环,只循环从1990年到2000年的几年,并打印价格与他们的年份相关的顺序。到目前为止我有这个代码,但我不确定为什么它不会运行,任何帮助都会很棒。

for x=1:year == 1990:2000
v = find(isfinite(price));
v
end 

2 个答案:

答案 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));