2016-05-20 4 views
0

私はのサイズを持っている行列Mを持っているとしましょう。メッシュグリッドを使用して次のxとyのインデックスを取得したとしましょう。MATLABでインデックスベースの変換を実行するにはどうすればよいですか?

[x, y] = meshgrid(1:1024, 1:1024); 

次は、(魚眼レンズやピンクッション効果を生み出すことを目標に、例えば)xyにいくつかの機能を適用してみましょう。

x_new = func1(x); 
y_new = func2(y); 

今、私はこれらの変換インデックスマッピングで新しいマトリックスNを作成するにはどうすれば、変換xy座標、x_newy_newのためのこれらの行列を使用していますか?言い換えれば、次のようなより洗練された方法がありますか?

for i = 1:1024 
    for j = 1:1024 
     N(i, j) = M(x_new(i, j), y_new(i, j)); 
    end 
end 

答えて

0

この問題に近づける正しい方法は、(i、j)の形の添字付きインデックスを線形インデックスに変換することであることが分かります。この操作で1024x1024の行列が生成されますが、これは扱いやすいものです。私たちは以下を行うことができます:

linIndices = sub2ind(size(x_new), x_new, y_new)); 
N = M(linIndices); 
1

次のことを試してみてください。

N=reshape(diag(M(x_new,y_new)),[N,N]) 

M(x_new,y_nex)を呼び出すことによって、あなたはすべての可能なインデックスの組み合わせでN^2行列でN^2を取得します。この行列の主対角だけが必要です。

+0

残念ながら、私の場合は、これはあまりにも大きな配列を作成します。しかし、ありがとう! – ArKi

0

行/列のインデックス値に関数を適用し、Mにインデックスを戻す代わりに、interp2を使用して新しい場所にMをサンプルしてみませんか?これにより、整数以外の値をfunc1func2から返すことができます。

[x, y] = meshgrid(1:1024, 1:1024); 
N = interp2(x, y, M, func1(x), func2(y)); 
+0

非整数行列インデックスのポイントは何ですか? – Bernhard

関連する問題