データの大きな行列がいくつかあり、xとyの位置を含む2列の行列がありますが、これらのポイントに対応するデータ要素を操作する簡単な方法はありますか?
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の位置を含む2列の行列がありますが、これらのポイントに対応するデータ要素を操作する簡単な方法はありますか?
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
、線形インデックスを介しての要素にアクセスすることです。線形インデックスは、最初に1番目の次元に沿って増分し、次に2番目の次元に沿って増分します。たとえば、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
の2番目の列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);