How to binning 2-d data ?

조회 수: 23 (최근 30일)
ARUNIMA DAS
ARUNIMA DAS 2021년 8월 31일
답변: Walter Roberson 2021년 9월 1일
I have a data of 29459*13 and I want to bin the data by taking 1500 rows means one bin will be 1500*13. Please can anyone help me out with this regard ?
Thank you for your time.
  댓글 수: 4
Christopher McCausland
Christopher McCausland 2021년 8월 31일
A very very low resolotion FFT maybe? However so much data will be lost that I cannot see the point of this @ARUNIMA DAS. What is the purpose of this?
Christopher
ARUNIMA DAS
ARUNIMA DAS 2021년 9월 1일
Extracting static features from each bin and do classification.
Thank you.

댓글을 달려면 로그인하십시오.

답변 (2개)

Adam Danz
Adam Danz 2021년 8월 31일
편집: Adam Danz 2021년 8월 31일
This approach uses repelem() to generate group IDs by rows.
data is the input matrix.
nRows specifies the number of consecutive rows for each bin (=1500)
binID is the bin ID numbers for each row of data. (1;1;1;....(1500 1s); 2;2;2;...;etc). The last group will have less than 1500 rows since the height of your matrix is not divisible by 1500.
% Create demo data
rng('default')
data = rand(29459,13);
% Specify number of rows per bin
nRows = 1500;
% Create bin IDs
nGroups = ceil(size(data,1)/nRows);
binID = repelem((1:nGroups)', nRows, 1);
binID(size(data,1)+1:end) = [];
Data from bin n is isolated by,
data(binID==n, :)
Compute the average of all data within columns of each bin.
binAvg will be a 20x13 matrix for 20 groups and 13 columns.
binAvg = groupsummary(data, binID(:), 'mean')
binAvg = 20×13
0.5000 0.5159 0.4873 0.5007 0.4993 0.4872 0.4819 0.4938 0.4956 0.4993 0.5045 0.4846 0.5154 0.5077 0.5094 0.5004 0.5163 0.4956 0.5026 0.5085 0.4905 0.4869 0.4879 0.4972 0.4950 0.4860 0.5060 0.4965 0.5001 0.5070 0.4909 0.4989 0.5038 0.5077 0.4988 0.5053 0.4802 0.5021 0.4994 0.4934 0.5038 0.5002 0.4930 0.5084 0.5150 0.5034 0.4975 0.5125 0.4915 0.4923 0.5056 0.5001 0.4976 0.5018 0.5007 0.4973 0.4926 0.5023 0.5014 0.5006 0.5037 0.4944 0.5168 0.4980 0.5061 0.4881 0.5065 0.4885 0.5037 0.4915 0.5004 0.5001 0.4989 0.5018 0.5043 0.5044 0.4988 0.4972 0.5043 0.4882 0.5054 0.4983 0.5083 0.5010 0.5066 0.5024 0.5058 0.4988 0.4827 0.5111 0.5172 0.4997 0.4947 0.4979 0.5099 0.5018 0.5054 0.4957 0.5020 0.5097 0.4956 0.5082 0.4995 0.4991 0.4964 0.4993 0.5043 0.5088 0.5049 0.5020 0.4979 0.4948 0.4879 0.4965 0.4955 0.4974 0.4985 0.4942 0.4950 0.5115 0.4819 0.4928 0.5164 0.5041 0.5058 0.4998 0.4979 0.4961 0.4990 0.4977
Confirm results by selecting a bin and comparing its average with the results above
testBin = 8;
testBinAvg = mean(data(binID==testBin,:));
isequal(testBinAvg, binAvg(testBin,:))
ans = logical
1
Compute the average of all data combined within each bin
binAvgAll will be 20x1 for 20 groups.
binAvgAll = arrayfun(@(g)mean(data(binID==g,:),'all'), unique(binID))
binAvgAll = 20×1
0.4974 0.4988 0.4997 0.5013 0.5010 0.4988 0.5023 0.5015 0.4988 0.4994
Confirm results by selecting a bin and comparing its average with the results above
testBin = 14;
testBinAvg = mean(data(binID==testBin,:),'all');
isequal(testBinAvg, binAvgAll(testBin))
ans = logical
1

Walter Roberson
Walter Roberson 2021년 9월 1일
You will have to decide how you want to handle the last partial bin that is only 959 rows instead of 1500.
You can return a row vector of the extracted features, and the result would be put together into a 20 x whatever array of features. Which you would transpose or not transpose depending on which classification routine you use.

카테고리

Help CenterFile Exchange에서 Multirate Signal Processing에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by