通过“点列表”访问矩阵元素

时间:2012-09-30 04:06:55

标签: matlab

我有一些大的数据矩阵,以及一个包含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

大多数情况下,我正在寻找一种通过更接近 data1(loc(i))

的方式访问数据元素的方法

2 个答案:

答案 0 :(得分: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 :(得分:1)

您可以将x-y位置转换为索引,并使用索引来处理矩阵。 然后你可以使用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);