index generation for multidimensional discretization

20 views (last 30 days)
Maximilian Dio
Maximilian Dio on 4 Jun 2021
Edited: Ronit on 23 Apr 2024 at 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

Answers (1)

Ronit
Ronit on 23 Apr 2024 at 9:02
Edited: Ronit on 23 Apr 2024 at 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!

Products


Release

R2018b

Community Treasure Hunt

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

Start Hunting!