次のコードがあります。
[~,ind]=max(Defender.Q,[],6);
Defender.Q
巨大な多次元行列です。
の 6 次元に複数の最大値がある場合Defender.Q
、max
関数はこれらの複数の最大値の最初のインデックスを示しています。複数の最大値の間でランダム化されたインデックスを取得したいと考えています。何か案は?ご協力いただきありがとうございます!
次のコードがあります。
[~,ind]=max(Defender.Q,[],6);
Defender.Q
巨大な多次元行列です。
の 6 次元に複数の最大値がある場合Defender.Q
、max
関数はこれらの複数の最大値の最初のインデックスを示しています。複数の最大値の間でランダム化されたインデックスを取得したいと考えています。何か案は?ご協力いただきありがとうございます!
わかりました。これは少し複雑ですが、すべての最大値のインデックスを取得し、andを使用してランダムに1つを選択できrandi
ますaccumarray
。
%# (1) Find the maxima
%# if you are interested in the global maximum
%# that may occur multiple times along dimension 6
[maxVal,maxIdx] = max(Defender.Q(:));
%# ALTERNATIVELY
%# if you are interested in local maxima along dimension 6
maxVal = max(Defender.Q,[],6);
maxIdx = find(bsxfun(@eq,Defender.Q,maxVal));
%# (2) pick random maximum for each 5D subarray
%# this assumes that there is no dimension #7 etc
%# In case there is, you need to add a column of ones
%# and then d7 etc to second input of accumarray
%# find row, col, etc subscripts of the maxima
[d1,d2,d3,d4,d5,d6] = ind2sub(size(Defender.Q),maxIdx);
%# create a 5-d array, containing one random index
%# from the maxima along dimension 6, or NaN
randIdx = accumarray([d1,d2,d3,d4,d5],d6,[],@(x)x(randi(length(x))),NaN);