5

Matlab で、次のような行列があるとします。

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

ここで、すべての要素の周りに 3x3 のサブマトリックスを見つける必要があります (したがって、各要素は 3x3 サブマトリックスの中心になります)。途中で fx を見つけても問題ありません。

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

サブマトリックスは次のとおりです。

2 3 4
2 3 4
2 3 4

しかし、マトリックスの境界、つまり最初または最後の行または列の要素にある場合、もちろん 3x3 サブマトリックスを見つけることはできません。代わりに、適合する部分行列が必要です。コーナーFXで私は得るだろう

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

サブマトリックスは次のとおりです。

1 2
1 2

国境の真ん中で、fx を取得します。

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

与える:

4 5 6
4 5 6

または別の例として:

1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9

与える:

6 7 8
6 7 8

私の言いたいことを理解していただければ幸いです。要素から境界線までの距離を見つけることができる機能がありません。

すべての要素をサブマトリックスの中心として扱うことができ、要素から境界線までの距離がサブマトリックスの境界線より下にあるかどうかをテストできれば (サブマトリックスの寸法は、5x5 サブマトリックスを fx に変更します)、次に私は作成中にサブマトリックスの一部を切り捨てることができます。

最も効率的な方法で要素から行列の境界までの距離を見つけるにはどうすればよいですか?

4

3 に答える 3

4

あなたの質問には直接答えませんが、より高いコンテキストでの問題は、3x3 要素に対して何らかのフィルターまたは処理を行うことだと思います。通常、解決策は、配列に余分な値を埋め込むことNaNです。次に、3x3 サブマトリックスを安全に抽出できますNaNs

コマンドを使用してパディングを行うことができますpadarray

編集(1): 別の回答に対するコメントを読みました。距離を計算するよりも、境界ケースを検出することに関心があるようです。境界に近づいたことを知りたい場合は、マスクを作成してみてはいかがでしょうか。

mask = false(size(A));
mask(1:2,:) = true;
mask(end-1:end,:) = true;
mask(:,1:2) = true;
mask(:,end-1:end) = true;
于 2012-06-19T08:39:15.290 に答える
2

質問をもう少し詳しく説明しましょう。サイズ nxm の行列があり、要素 i,j を選択します。要素 i,j の境界線からの距離を知りたいですか? それは次のようになります: min(i,j,ni,mj)

于 2012-06-19T08:39:15.430 に答える
2
% Define the example data:

Matrix = repmat(1:9, 9, 1)

編集:自由なサイズの部分行列を使用した一般的なソリューション:(サイズは奇数でなければなりません)

% Define the size of submatrix (square matrix assumed here).

SubmatrixSize = 5;

% Check that the size of submatrix is an odd number.

if (mod(SubmatrixSize, 2) == 0)
    error('SubmatrixSize must be odd number.');
end

Distance = floor(SubmatrixSize/2);

VertSize = size(Matrix, 1);
HorzSize = size(Matrix, 2);

for rowIndex = 1:VertSize
    yIndices = (rowIndex-Distance:rowIndex+Distance);
    yIndices = yIndices(find(yIndices >= 1 & yIndices <= VertSize));
    for colIndex = 1:HorzSize
        xIndices = (colIndex-Distance:colIndex+Distance);
        xIndices = xIndices(find(xIndices >= 1 & xIndices <= HorzSize));
        SubmatricesCellArray{rowIndex, colIndex} = Matrix(yIndices, xIndices);
    end
end

これは、3x3 部分行列に対してのみ可能な解決策です。

% This code only works for 3x3 submatrices.

VertSize = size(Matrix, 1);
HorzSize = size(Matrix, 2);

for rowIndex = 1:VertSize
    yIndices = nonzeros(rowIndex-1:rowIndex+1);
    if yIndices(end) > VertSize
        yIndices(end) = [];
    end
    for colIndex = 1:HorzSize
        xIndices = nonzeros(colIndex-1:colIndex+1);
        if xIndices(end) > HorzSize
            xIndices(end) = [];
        end
        SubmatricesCellArray{rowIndex, colIndex} = Matrix(yIndices, xIndices);
    end
end

次に、各サブマトリックスをSubmatricesCellArray{y, x}.

于 2012-06-19T08:41:55.633 に答える