5

3-dimensional行列があり、2 番目の次元に沿って計算し、max最大値の線形インデックスを取得したいとします。ただし、 はmax-function1 つの次元に沿った添字のみを返します。

A = randn([5,5,5]);        % Generate random matrix
[M, Ind] = max(A,[],2);    % Take the max along dimension 2

indexを に転送するにlinear indexingはどうすればよいですか?

M == A(Ind)

真になる?

この問題に対する私の意図は、two multi-dimensional行列があり、行列を計算する必要があるmaxということfirstです。second次に、マトリックス内の最大値を見つけた正確な位置で、マトリックス内の値にアクセスしたいと思いますfirst

4

4 に答える 4

2

1 つの方法は、次を使用することsub2indです。

A = randn([5,5,5]);       
[M, col] = max(A,[],2);   

[m,n,o] = size(A);

dim1 = mod((0:m*o-1)', m)+1;
dim2 = col(:);
dim3 = ceil((1:m*o)/m)';

ind = sub2ind(size(A), dim1, dim2, dim3)

動作確認

isequal(M(:), A(ind))

と同じ形にするにはM:

reshape(ind, m, 1, o)
于 2014-10-29T15:31:07.977 に答える
1

他の次元のインデックスを作成します。

薄暗い 1 では、インデックスを最も速く変更する必要があります:[1,2,...,size(A,1)]そして今回size(A,3)は:

idx1 = repmat((1:size(A,1))',size(A,3),1);

dim 2 では、インデックスは で与えられIndます。

薄暗い 3 では、インデックスの変更が最も遅くなる必要[1,1,...,1]size(A,1)あり[2,2,...,2]ますsize(A,3)

idx3 = ones(size(A,1),1)*(1:size(A,3));

単一値へのアクセス:

 M_ = A(sub2ind(size(A),idx1(:),Ind(:),idx3(:)));

比較:

M(:) == M_
于 2014-10-29T15:58:17.487 に答える
1

立体ケース

[m, n, p] = size(A);
[M, Ind] = max(A,[],2);
LinInd = bsxfun(@plus, (1:m).', (0:p-1)*m*n); %'//
LinInd = LinInd(:) + (Ind(:)-1)*m;

目的の線形インデックスはLinIndです。これにより、

A(LinInd) == M(:)

すべてのエントリで(比較が意味を持つように、右側にtrue必要であることに注意してください)。(:)

一般的な多次元の場合:

d = 3; %// dimension along which max will be computed
s = size(A);
sLow = prod(s(1:d-1));
sHigh = prod(s(d+1:end));
[M, Ind] = max(A,[],d);
LinInd = bsxfun(@plus, (1:sLow).', (0:sHigh-1)*sLow*s(d)); %'//
LinInd = LinInd(:) + (Ind(:)-1)*sLow;
于 2014-10-29T23:49:52.010 に答える
0

Aとが 2 つの行列であり、そこからインデックスを取得し、それらのインデックスを使用して目的の出力にインデックスBを付ける必要があるとします。同じことを達成するための1つのアプローチは、次のようになります-maxAB

%// Your code to get Ind
A = randn([5,5,5]);        % Generate random matrix
[M, Ind] = max(A,[],2);    % Take the max along dimension 2

%// ------- Solution code -------------

%// Get the size of A
[n1,n2,n3] = size(A)

%// Linear indices corresponding to column and third dimension indices
col_dim3_lin_idx = bsxfun(@plus,(Ind-1)*n1,permute([0:n3-1]*n1*n2,[1 3 2]))

%// Finally get the overall linear indices
linear_index = bsxfun(@plus,col_dim3_lin_idx,[1:n1]') %//'

%// Get the corresponding elements from B
out = B(linear_index)

目的の線形インデックスを 2D 配列として取得するわずかに異なる方法は、次のようになります -

[n1,n2,n3] = size(A) %// Get the size of A
idx = bsxfun(@plus,bsxfun(@plus,squeeze((Ind-1)*n1),[0:n3-1]*n1*n2),[1:n1]')

idx(:)この新しいアプローチでは、線形インデックスの列ベクトルになります。これにインデックスを付けることができます。BつまりB(idx(:))、目的の出力を列ベクトルとして取得できます。

于 2014-10-29T15:30:21.863 に答える