8

私は巨大な2Dマトリックスを持っており、そこから15の異なる100x100パーツを抽出したいと思います。パーツの左上のインデックスが保存される2つのベクトルxとyがあります。私はこのようなものを使用しました:

result = cam1(x(1:end):(x(1:end)+99), y(1:end):(y(1:end)+99));

しかし、結果は15x100x100ではなく100x100マトリックスになります。なんで?

ループを使用して簡単に実行できることは知っていますが、ループを使用することは許可されていません(これは画像処理の演習の一部です)。もう1つの可能性は、15行すべてを書き込むことですが、それはちょっと醜いです。

エレガントな解決策はありますか?ありがとう。

4

3 に答える 3

6

ループなしでこれを行う方法はいくつかあります。ほとんどのソリューションは、ベクトルxyをインデックスのより大きな行列に拡張することを含み、1つ以上の関数REPMATBSXFUN、またはSUB2INDを使用する可能性があります。マトリックスの索引付けに関する優れたチュートリアルは、ここにあります。

しかし、あなたはエレガントな解決策を求めていたので、これはやや珍しい解決策です。これは、匿名関数と関数ARRAYFUNおよびCATを使用します。

indexFcn = @(r,c) cam1(r:(r+99),c:(c+99));
result = arrayfun(indexFcn,x,y,'UniformOutput',false);
result = cat(3,result{:});

説明:

最初の行は無名関数を作成します。これは、mファイルに入れなくてもオンザフライで作成できる単純な1行の関数です。この関数は、 cam1から100行100列の部分行列を抽出するために使用される2つの入力rcを定義します。変数indexFcnは、関数を呼び出すために使用される関数ハンドルを格納します。匿名関数で使用されるcam1の値は静的であることに注意してください。変数cam1の値が変更された場合でも、無名関数は関数の作成時にcam1にあった値を使用します。

2行目は、配列のすべての要素に関数を適用するARRAYFUNを呼び出します。ARRAYFUNは、 xyの各エントリをループし、値をindexFcnに渡します。出力は、各セルに100行100列の行列が含まれる15要素のセル配列であるresultに格納されます。

3行目は、CAT関数を使用して、100x100の行列を100x100x15の行列に連結します。

于 2009-05-25T17:57:35.527 に答える
4

これは明らかに宿題なので、完全な答えは提供しません。

マトリックスにインデックスを付けるには、いくつかの方法があります。このように分散インデックスを設定する場合は、単一のインデックスを使用する必要があります。したがって、

A = rand(5,6)
A =
      0.81472      0.09754      0.15761      0.14189      0.65574      0.75774
      0.90579       0.2785      0.97059      0.42176     0.035712      0.74313
      0.12699      0.54688      0.95717      0.91574      0.84913      0.39223
      0.91338      0.95751      0.48538      0.79221      0.93399      0.65548
      0.63236      0.96489      0.80028      0.95949      0.67874      0.17119

A(3:4,3:4)

Aから2x2の部分行列が生成されます。ただし、その部分行列は次のように見つけることもできます。

reshape(A([13 14 18 19]),[2 2])
ans =
      0.95717      0.91574
      0.48538      0.79221

なぜこのインデックスセットを選んだのですか?答えについては、sub2indについて読む必要があります。

[I,J] = ndgrid(3:4,3:4);
sub2ind([5 6],I(:),J(:))
ans =
    13
    14
    18
    19

結局、抽出されたパーツから15x100x100の配列が必要なようです。したがって、私が示した部分から必要なインデックス配列を構築します。あなたはそれを適切な形にするために最後に最終的な形を変える必要があるでしょう。

これはあなたにあなたの宿題を終えるのに十分なスタートを与えるはずです。

于 2009-05-25T13:30:15.560 に答える
0

あなたはすべてが難しいと思います、これを試してください:mat2cell

于 2012-06-22T00:06:24.727 に答える