我有一些大型数据矩阵,以及一个包含 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))的方式访问数据元素的方法
我有一些大型数据矩阵,以及一个包含 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))的方式访问数据元素的方法
你想要的是data
通过它们的线性索引访问元素。线性索引首先沿第一个维度递增,然后沿第二个维度递增,依此类推。例如,3×2 数组的元素将按以下顺序寻址
1 3 5
2 4 6
因此,要(2,1)
通过线性索引获取 2×3 数组的元素,您可以调用array(3)
. 要在线性索引和下标之间进行转换(例如对2,3
),您可以分别使用ind2sub
和sub2ind
。
在你的情况下,你会跑
linIdx = sub2ind(size(data),loc(:,2),loc(:,1))
如果第一列loc
索引为 的列data
,第二列loc
索引为行。
然后您可以循环linIdx
将循环内的函数调用更改为
testFunc(data1(linIdx(i)), data2(linIdx(i)), othervals)
您可以将 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);