5

3D マトリックス内のセルを囲む 8 つのセルのインデックスと値を返したいと思います。

mat = rand(5,5,5);

% Cell of interest
pos = [3 3 3]
pos_val = mat(pos(1), pos(2), pos(3))

% Surrounding cells
surrounding_pos = [pos(1)-1:pos(1)+1; pos(2)-1:pos(2)+1; pos(2)-1:pos(2)+1]
surrounding_val = mat(surrounding_pos(1,:), surrounding_pos(2,:), surrounding_pos(3,:))

これは行列の中心にある値に対しては問題なく機能しますが、pos が端にある場合は機能しません。(たとえば、pos がの場合、around_pos には[3,4,5]が含まれますが[3,4,6]、これは範囲外です)

0 または >size(mat) 未満の Surround_pos 値を明らかに削除できますが、これはひどく MATLABian メソッドのようには見えません。何か案は?

4

3 に答える 3

5

ここで説明したのと同じソリューションですが、複数の (任意の) ディメンションに拡張されています。

mat = randi(10,5,5,5);
siz = size(mat );
N = numel(siz); % number of dimensions
M = 1; % surrounding region size

pos = [3 3 3];
pos_val = mat(pos(1), pos(2), pos(3));

surrounding_pos = cell(N,1);
for ii=1:N
    surrounding_pos{ii} = max(1,pos(ii)-M):min(siz(ii),pos(ii)+M);
end
surrounding_val2 = mat(surrounding_pos{:});

重要な部分は最後の 4 行です。これにより、すべてのディメンションの最大値、最小値を c/p する必要がなくなります。

または、短いコードが好きな場合は、ループを次のように変更しますarrayfun

surrounding_pos = arrayfun(@(ii) max(1,pos(ii)-M):min(siz(ii),pos(ii)+M), 1:N,'uni',false);
surrounding_val2 = mat(surrounding_pos{:});
于 2012-09-28T07:37:56.250 に答える
4

これが片付けられたバージョンです。乾杯。

mat = rand(5,5,5);
N = size(mat)
if length(N) < 3 || length(N) > 3; error('Input must be 3 dimensional'); end;
pos = [1 3 5]
surrounding_val = mat(max(pos(1)-1, 1):min(pos(1)+1, N(1)), max(pos(2)-1, 1):min(pos(2)+1, N(2)), max(pos(3)-1, 1):min(pos(3)+1, N(3))) 

編集:エラートラップを追加しました。

于 2012-09-28T07:10:41.333 に答える
0

マトリックスで選択したポイントの周囲のインデックスを取得する必要があったため、この投稿を見つけました。ここでの回答は周囲の値の行列を返しているようですが、質問は周囲のインデックスにも関心があります。これは、以前は MATLAB に存在することを知らなかった "try/catch" ステートメントで行うことができました。2D 行列の場合、Z:

%Select a node in the matrix
Current = Start_Node;

%Grab its x, y, values (these feel reversed for me...)
C_x = rem(Start_Node, length(Z));
if C_x ==0
    C_x =length(Z);
end
C_y = ceil(Start_Node/length(Z));
C_C = [C_x, C_y];

%Grab the node's surrounding nodes.
try
    TRY = Z(C_x - 1, C_y);
    Top = Current -1;
catch
    Top = Inf;
end
try
    TRY = Z(C_x + 1, C_y);
    Bottom = Current +1;
catch
    Bottom = Inf;
end
try
    TRY = Z(C_x, C_y + 1);
    Right = Current + length(Z);
catch
    Right = Inf;
end
try
    TRY = Z(C_x, C_y - 1);
    Left = Current - length(Z);
catch
    Left = Inf;
end

surround = [Top, Bottom, Left, Right];
m = numel(surround == inf);
k = 1;
%Eliminate infinites.

surround(surround==inf) =[];

誰かがこの情報に関連性があることを願っています。

于 2013-09-27T14:54:10.010 に答える