2016-03-06 3 views
-1

У меня есть столбец лет с 1981 по 2000 год, который соответствует другому столбцу цен на товар. Я пытаюсь сделать цикл, который повторяется только через годы с 1990 по 2000 год и печатает цены, чтобы соответствовать их году. У меня есть этот код до сих пор, но я не уверен, почему он не будет работать, любая помощь будет потрясающей.Как пропустить вектор, соответствующий другому вектору MATLAB

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

Он не будет работать, потому что вы, кажется, есть только придумал какой-то синтаксис! Где вы прочитали, что 'for x = 1: year == 1990: 2000' был действителен? –

ответ

0

Если входные данные что-то вроде этого, где первый столбец года, а второй столбец цена

data = [1990, 2.50; 
     1991, 3.00; 
     ... 
     2000, 4.00]; 

Вы можете перебрать года в вашем цикл (Обратите внимание на синтаксис и как это сравнивается с таковым в вашем посте), а затем найдите второй столбец, где цена соответствует этому году, используя 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 

Редактировать

Если вы для цикла аверса, вы можете определенно сделать то же самое, не для цикла. Наиболее надежным решением является использование arrayfun.

annualPrices = arrayfun(@(x)prices(years == x), years, 'uniform', 0); 

Это вернет массив ячеек, в котором каждый элемент - это все цены за данный год.

Если у вас есть только одна цена в год, вы можете опустить вход uniform, и вы получите массив цен.

annualPrices = arrayfun(@(x)prices(years == x), years); 

Одним из преимуществ является то, что ни один из этих подходов не требует дополнительных операций (например, сортировки) на ваших данных.

+0

Спасибо всем, что это большая помощь – Jay

+0

@Suever, не нужно использовать for-loop. – NKN

+0

@NKN Я полностью согласен.Я старался максимально упростить его для пользователя (аналогично его исходному коду), не слишком запутывая. Я добавлю в версию non-for loop. – Suever

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)); 
Смежные вопросы