2016-03-06 68 views
-1

我有一列從1981年到2000年的年份對應於另一列的價格。我正試圖製作一個循環,循環遍歷從1990年到2000年的這些年份,並打印出與其年份相關的價格。到目前爲止我有這個代碼,但我不知道爲什麼它不會運行,任何幫助都會很棒。如何通過對應於另一個向量的向量循環MATLAB

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

因爲你似乎剛纔它將無法運行發明了一些語法!你在哪裏讀過「x = 1:year == 1990:2000」是有效的? –

回答

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 

編輯

如果你是環厭惡,你可以definitly做同樣的事情,而沒有for循環。最強大的解決方案是使用arrayfun

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

這將返回一個單元格數組,其中每個元素都是給定年份的所有價格。

但是,如果您保證每年只有一個價格,您可以省略uniform輸入,您將得到一系列價格。

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

其中一個好處是,這些方法都不需要對數據進行額外的操作(例如排序)。

+0

謝謝大家,這是一個很大的幫助 – Jay

+0

@Suever,不需要使用for循環。 – NKN

+0

@NKN我完全同意。我試圖讓用戶儘可能簡單(類似於他們的初始代碼),而不會混淆太多。我將添加非for循環版本。 – 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));