3

matlabの「min」関数から返されたインデックスを使用して、3次元の3D行列でデータを取得するにはどうすればよいですか?たとえば、次のコードがあります。

%a is a 3D matrix
[res, index] = min(a, [], 3);

次のようなインデックスを使用してmin要素にアクセスしたい。

a(index);

注:res変数を使用したくない

4

2 に答える 2

3

それらすべてを取得するには:

a=rand(3,2,3);
[res, index] = min(a, [], 3);

sizeA=size(a);
sizeA12 = prod(sizeA(1:2));
lin_idx = sub2ind([sizeA12 sizeA(3)],1:sizeA12,index(:)');
a(lin_idx)

ans =

        0.0344   0.0971   0.171   0.695  0.0318  0.187

>> res(:)'

ans =

        0.0344   0.0971   0.171   0.695  0.0318  0.187

より一般的なアプローチ

a=rand(3,2,3); % sample data

dim_min = 2; % dimension along to take the minimum
[res, index] = min(a, [], dim_min);

sizeA       = size(a);
sizeAstart  = prod(sizeA(1:dim_min-1));
sizeAend    = prod(sizeA(dim_min+1:end));
idstart     = repmat(1:sizeAstart,1,sizeAend);
idend       = repmat(1:sizeAend  ,1,sizeAstart);

lin_idx = sub2ind([sizeAstart sizeA(dim_min) sizeAend ],idstart,index(:)',idend);
a(lin_idx)

結果の形状を変更して、元のマトリックスと同じ次元にすることもできます(最小化された次元は省略されています)。

reshape(a(lin_idx),sizeA([1:dim_min-1 dim_min+1:end]))

任意のサイズのデータ​​マトリックスまたは任意の値で機能しますdim_min1<=dim_min<=ndims(a)もちろん)

于 2012-05-10T08:19:01.433 に答える
0

残念ながら、Gunther(ほぼ6歳)の回答にコメントするために必要な評判ポイントを取得していませんが、ここにエラーがあり、「より一般的なアプローチ」が正しくありません。

「idend」インデックスは、このインデックスに必要な1 1 1 2 2 2 3 3 3の順序を取得するために、repmatではなく、repelemで複製する必要があります。したがって、Guntherのアプローチの機能的な例を次に示します。

より一般的なアプローチ(修正されたidend)

a=rand(3,2,3); % sample data

dim_min = 2; % dimension along to take the minimum
[res, index] = min(a, [], dim_min);

sizeA       = size(a);
sizeAstart  = prod(sizeA(1:dim_min-1));
sizeAend    = prod(sizeA(dim_min+1:end));
idstart     = repmat(1:sizeAstart,1,sizeAend);
idend       = repelem(1:sizeAend  ,1,sizeAstart);

lin_idx = sub2ind([sizeAstart sizeA(dim_min) sizeAend ],idstart,index(:)',idend);
% check correct result
isequal(a(lin_idx)',res(:))
于 2018-07-05T11:58:46.740 に答える