index generation for multidimensional discretization

21 ビュー (過去 30 日間)
Maximilian Dio
Maximilian Dio 2021 年 6 月 4 日
編集済み: Ronit 2024 年 4 月 23 日 9:02
Hi,
I require to discretize (bin) my feature space X, it has corresponding function values Y, therefore I need the index of the values in the bin.
So I have a very crude which does what I want but it is not that nice to expand for larger dimensions...
X = randn(1000,4,1);
Y = randn(1000,1);
nBins = 2;
[xD,E] = discretize(X,nBins);
idx = cell(nBins,nBins,nBins,nBins);
for i = 1:size(X,1)
idx{xD(i,1),xD(i,2),xD(i,3),xD(i,4)}(end+1) = i;
end
Y(idx{1,2,1,2},:)
Is there a pre-implemented code which does this (but in nice), or some fancy new algorithm which does bining with indexing (however I have only Matlab 2018 available)?
Kind Regards Max

回答 (1 件)

Ronit
Ronit 2024 年 4 月 23 日 9:02
編集済み: Ronit 2024 年 4 月 23 日 9:02
Hi Maximilian,
In MATLAB, while there isn't a direct built-in function that discretizes and indexes multi-dimensional data in one go, you can achieve a cleaner and more scalable solution by using some of MATLAB's built-in functions creatively. The approach involves discretizing each dimension of your feature space X using discretize, then constructing a linear index from the multi-dimensional indices, which allows you to group or bin the data more flexibly.
Here's a refined approach that should work for any number of dimensions in X:
X = randn(1000,4);
Y = randn(1000,1);
nBins = 2;
[xD, ~] = discretize(X, nBins);
% Calculate the size for each dimension in the linear index space
dims = repmat(nBins, 1, size(X, 2));
% Convert multi-dimensional indices to linear indices
linearIndices = sub2ind(dims, xD(:,1), xD(:,2), xD(:,3), xD(:,4));
% Determine the maximum possible index to size idx appropriately
maxIndex = prod(dims);
% Initialize idx with the correct size
idx = cell(maxIndex, 1);
% Populate idx
for i = 1:length(linearIndices)
idx{linearIndices(i)}(end+1) = i;
end
% Accessing Y values for an example bin combination
% Define the bin combination
binCombination = [1, 2, 1, 2];
% Convert bin combination to linear index
exampleLinearIndex = sub2ind(dims, binCombination(1), binCombination(2), binCombination(3), binCombination(4));
% Now access Y values safely
if ~isempty(idx{exampleLinearIndex})
Y_example = Y(idx{exampleLinearIndex}, :);
else
Y_example = []; % Handle case where the bin combination is empty
end
disp(Y_example);
1.5871 1.4150 0.7978 1.5177 0.4729 0.9646 -0.7731 -0.0329 -0.2298 -0.1042 0.8469 0.0728 1.2432 -1.3099 0.4706 -0.0946
Explanation for the code:
1. It discretizes the feature space X into nBins bins for each dimension.
2. It converts the multi-dimensional bin indices xD for each sample into a single linear index linearIndices. This is a key step that allows you to handle an arbitrary number of dimensions more easily.
3. Then it groups the indices of X (which correspond to rows in Y) based on their bin combination, using the linear index to identify each unique bin combination.
4. Then it demonstrates how to access the Y values corresponding to a specific bin combination by converting that combination into a linear index and then using this index to access the relevant cell in idx.
Please refer to the documentation of “sub2ind” for better understanding of the function: https://www.mathworks.com/help/matlab/ref/sub2ind.html
Hope this helps!

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

製品


リリース

R2018b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by