2

データの大きな行列がいくつかあり、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))に近いものでデータ要素にアクセスする方法を探しています

4

2 に答える 2

4

必要なのはdata、線形インデックスを介しての要素にアクセスすることです。線形インデックスは、最初に1番目の次元に沿って増分し、次に2番目の次元に沿って増分します。たとえば、3行2列の配列の要素は次の順序でアドレス指定されます

1 3 5
2 4 6

したがって、(2,1)線形インデックスを介して2行3列の配列の要素を取得するには、を呼び出しますarray(3)。線形インデックスと添え字(ペアなど)の間で変換するには、それぞれと2,3を使用できます。ind2subsub2ind

あなたの場合、あなたは走ります

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

locインデックスの最初の列をの列に、インデックスdataの2番目の列locを行に変換する場合。

次に、ループオーバーlinIdxして、ループ内の関数呼び出しを次のように変更できます。

testFunc(data1(linIdx(i)), data2(linIdx(i)), othervals)
于 2012-09-30T13:02:32.433 に答える
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);
于 2012-09-30T04:27:21.787 に答える