2012-09-30 49 views
2

我有一些大的數據矩陣,並且包含x和y位置的兩個列矩陣有沒有一種更簡單的方法來處理與這些點對應的數據元素:通過「點列表」訪問矩陣元素

for adj = 1:size(loc,1) 
    testFunc(data1(loc(i,2),loc(i,1)), data2(loc(i,2),loc(i,1)), othervals) 
end 

主要是我正在尋找一種方式來訪問的東西更接近數據1(LOC(I))

回答

4

你想要的是通過其線性指標訪問的data元素。線性指數首先沿第一維遞增,然後沿第二維遞增,等等。例如,一個3×2陣列的元件將在下面的順序

1 3 5 
2 4 6 

因此,要獲得一個2×3經由線性索引陣列的元件(2,1)加以處理,可調用array(3)。要在線性索引和下標之間進行轉換(例如對2,3),可以分別使用ind2subsub2ind

在你的情況,你會運行

linIdx = sub2ind(size(data),loc(:,2),loc(:,1)) 

如果loc指標的第一列進data列,並loc指標第二列到行。

然後你可以遍歷linIdx改變你的函數調用內循環,以

testFunc(data1(linIdx(i)), data2(linIdx(i)), othervals) 
1

可以XY座標轉換成指數的數據元素,並使用該指數以滿足矩陣。 然後你可以使用arrayfun,將你的函數發揮到所有元素。

ind=sub2ind(size(data1),location(:,1),location(:,2)); 
output=arrayfun(@(x,y) testFunc(x,y,othervals),data1(ind),data2(ind)); 

,或者如果testFunc不輸出標:

output=arrayfun(@(x,y) testFunc(x,y,othervals),data1(ind),data2(ind),'UniformOutput',0); 
+0

testFunc只是一個佔位符,我已經得到了很多更多的事情(數學和各種函數調用的矩陣元素其中一些使用x,y值進行計算),而我真正需要的是通過* ForEach *樣式循環中某種「點」更簡潔地訪問矩陣元素的方法。我可以根據需要更改點列表的格式。 –

+0

具體來說,我有條件上基於在這些點上運行的其他操作的結果運行的操作。 –