2012-06-24 47 views
2

我有兩個數組,xyx是函數的輸入,y是函數值。例如,x = [ 1 2 3 4 5 6 7 8 9 10],y = [ 3 6 2 4 1 6 7 0 1 8 ]。兩者長度相同。Matlab中預先計算函數的緩存結果

假設我有一個另一個數組z含有[ 2 3 8 9 10 3](未長度相同xy) 是否有(在相應索引返回值)產生輸出[6 2 0 1 8 2]任何功能,而無需通過的每個元素使用環陣列?

謝謝你這麼多

EDIT1 *我該怎麼辦,如果陣列中的數字不是整數?

+0

你的例子'x'和'y'是**不是**長度相同,這使得這個問題很難回答...... –

+0

哦,我犯了一個大錯誤, x = [1 2 3 4 5 6 7 8 9 10] y = [3 6 2 4 1 6 7 0 1 8] z = [2 3 8 9 10 3] 結果= [6 2 0 1 8 2] –

+0

類似的問題:[什麼是設計具有有限內存的記憶系統的簡單方法?](http://stackoverflow.com/q/5023998/97160)。 – Amro

回答

0
y(z) 

這就是你需要......

+0

非常感謝你 –

+0

如果z不是整數,我該怎麼辦? –

0

我覺得你只是想:

y(z); 

這將返回y向量的第i個元素。你可能想

y(x(z)); 

將在您的示例返回相同的結果,因爲x是通過10

與這兩個z的只是價值1只能包含正整數,而在第二種情況下x也必須只包含正整數。

+0

我不認爲'y(x(z))'會添加任何有用的功能。你實際上需要'x'的反向映射。 –

+0

如果z不是整數,我該怎麼辦? –

0

如果您使用的是MATLAB版本更新比2008B,你可以使用containers.Map類做你想要什麼,甚至非整數的,非連續和非數值:

x = [ 1 2 3 4 5 6 7 8 9 10]; 
y = [ 3 6 2 4 1 6 7 0 1 8 ]; 
z = [ 2 3 8 9 10 3]; 
F = containers.Map(x,y); 
% for a single element: 
Fz1 = F(z(1)) 
% for multiple elements at the same time, you need to use arrayfun 
Fz = arrayfun(@(x)(F(x)),z) 

的Map類實際上創建了一個所謂的散列表,因此您可以將幾乎任何值映射到其他值(例如字符串,單元格,數組等)。

當該項目不存在時,它將返回一個錯誤。

如果你不能使用MATLAB 2008b或更新版本,有三種可能的非整數域值。

使用插值方法,如interp1。這可能會產生錯誤的值(事先未提供的值)。您可以使用ismember(z, x)檢查該情況。其次,你可以創建你自己的方案,從非整數到整數(例如,如果你所有的值都是0.5的倍數,乘以2),並使用Oli展示的解決方案。

另一種解決方案是使用struct來模擬地圖的行爲。然後,您只需要將域值轉換爲有效的字段名稱(即在MATLAB中爲有效變量名稱的字符串,這可以通過使用genvarname函數來實現)。

最後兩個解決方案有點骯髒,如果您不考慮考慮,則容易出錯。所以我認爲他們只是作爲最後的手段。

相關問題