Reforming index without using loops

16 vues (au cours des 30 derniers jours)
Anson
Anson le 17 Mar 2023
Modifié(e) : Anson le 17 Mar 2023
Heya,
I've just started using Matlab and need some help on reforming an index based on a logical equation to dictate what data goes into each column without looping. afterwards determine the averaqge of each column.
The dataset is a fixed 1 row array that has been generated beforehand.
Currently the best code I can imagine is basically doing the loop manually which is very ugly
Is there a better way to execute this concept without copy pasting the same code in place of a loop
Heres an example code with my best representation of my issue
% Create a repeating counter with values 1-12 repeating 4 times (48 values total)
counter = 1:12;
counter = repmat(counter,1,4)
counter = 1×48
1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6
% Creating a binary sequence with the same length
binarySequence = randi([0,1],1,length(counter));
% Creating a data set (Fixed)
dataSet = randi(50,1,length(counter));
% Reforming the dataset by taking values of the counter to determine what
% value will go in each column
reformDataSet(:,1) = dataSet(counter == 1);
reformDataSet(:,2) = dataSet(counter == 2);
reformDataSet(:,3) = dataSet(counter == 3);
reformDataSet(:,4) = dataSet(counter == 4);
reformDataSet(:,5) = dataSet(counter == 5);
reformDataSet(:,6) = dataSet(counter == 6);
reformDataSet(:,7) = dataSet(counter == 7);
reformDataSet(:,8) = dataSet(counter == 8);
reformDataSet(:,9) = dataSet(counter == 9);
reformDataSet(:,10) = dataSet(counter == 10);
reformDataSet(:,11) = dataSet(counter == 11);
reformDataSet(:,12) = dataSet(counter == 12)
reformDataSet = 4×12
44 37 49 30 20 35 34 7 12 8 22 31 7 48 4 46 24 1 26 5 22 1 43 47 49 4 12 1 19 44 22 41 46 1 41 16 39 42 7 45 40 24 28 30 22 30 34 35
% Find Average of each column
avgDataSet = mean(reformDataSet)
avgDataSet = 1×12
34.7500 32.7500 18.0000 30.5000 25.7500 26.0000 27.5000 20.7500 25.5000 10.0000 35.0000 32.2500
% Removing data based on when the binary sequence is equal to 0
dataSet(find(binarySequence == 0)) = NaN
dataSet = 1×48
NaN NaN 49 NaN NaN 35 NaN NaN 12 8 NaN NaN 7 NaN 4 NaN 24 NaN 26 5 NaN 1 NaN 47 49 4 NaN NaN NaN 44
% Reforming the dataset by taking values of the counter to determine what
% value will go in each column
binnedDataSet(:,1) = dataSet(counter == 1);
binnedDataSet(:,2) = dataSet(counter == 2);
binnedDataSet(:,3) = dataSet(counter == 3);
binnedDataSet(:,4) = dataSet(counter == 4);
binnedDataSet(:,5) = dataSet(counter == 5);
binnedDataSet(:,6) = dataSet(counter == 6);
binnedDataSet(:,7) = dataSet(counter == 7);
binnedDataSet(:,8) = dataSet(counter == 8);
binnedDataSet(:,9) = dataSet(counter == 9);
binnedDataSet(:,10) = dataSet(counter == 10);
binnedDataSet(:,11) = dataSet(counter == 11);
binnedDataSet(:,12) = dataSet(counter == 12)
binnedDataSet = 4×12
NaN NaN 49 NaN NaN 35 NaN NaN 12 8 NaN NaN 7 NaN 4 NaN 24 NaN 26 5 NaN 1 NaN 47 49 4 NaN NaN NaN 44 22 NaN 46 NaN 41 16 39 NaN NaN NaN 40 24 28 NaN 22 30 NaN 35
% Find Average of each column
avgBinnedDataSet = nanmean(binnedDataSet)
avgBinnedDataSet = 1×12
31.6667 4.0000 26.5000 NaN 32.0000 34.3333 25.3333 5.0000 26.6667 13.0000 41.0000 32.6667

Réponse acceptée

Stephen23
Stephen23 le 17 Mar 2023
Modifié(e) : Stephen23 le 17 Mar 2023
Verb
% Create a repeating counter with values 1-12 repeating 4 times (48 values total)
counter = 1:12;
counter = repmat(counter,1,4)
counter = 1×48
1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6
% Creating a binary sequence with the same length
binarySequence = randi([0,1],1,length(counter));
% Creating a data set (Fixed)
dataSet = randi(50,1,length(counter));
% Reforming the dataset by taking values of the counter to determine what
% value will go in each column
reformDataSet(:,1) = dataSet(counter == 1);
reformDataSet(:,2) = dataSet(counter == 2);
reformDataSet(:,3) = dataSet(counter == 3);
reformDataSet(:,4) = dataSet(counter == 4);
reformDataSet(:,5) = dataSet(counter == 5);
reformDataSet(:,6) = dataSet(counter == 6);
reformDataSet(:,7) = dataSet(counter == 7);
reformDataSet(:,8) = dataSet(counter == 8);
reformDataSet(:,9) = dataSet(counter == 9);
reformDataSet(:,10) = dataSet(counter == 10);
reformDataSet(:,11) = dataSet(counter == 11);
reformDataSet(:,12) = dataSet(counter == 12)
reformDataSet = 4×12
36 48 11 6 3 13 10 46 25 22 26 46 30 22 31 19 3 3 4 16 4 39 17 15 21 43 46 1 27 44 11 50 21 26 31 33 29 40 44 16 33 39 44 1 13 12 33 39
% Find Average of each column
avgDataSet = mean(reformDataSet)
avgDataSet = 1×12
29.0000 38.2500 33.0000 10.5000 16.5000 24.7500 17.2500 28.2500 15.7500 24.7500 26.7500 33.2500
% Removing data based on when the binary sequence is equal to 0
dataSet(find(binarySequence == 0)) = NaN
dataSet = 1×48
36 48 11 NaN NaN 13 10 NaN NaN 22 NaN 46 NaN NaN NaN 19 NaN NaN NaN 16 4 39 NaN NaN 21 NaN 46 NaN 27 44
% Reforming the dataset by taking values of the counter to determine what
% value will go in each column
binnedDataSet(:,1) = dataSet(counter == 1);
binnedDataSet(:,2) = dataSet(counter == 2);
binnedDataSet(:,3) = dataSet(counter == 3);
binnedDataSet(:,4) = dataSet(counter == 4);
binnedDataSet(:,5) = dataSet(counter == 5);
binnedDataSet(:,6) = dataSet(counter == 6);
binnedDataSet(:,7) = dataSet(counter == 7);
binnedDataSet(:,8) = dataSet(counter == 8);
binnedDataSet(:,9) = dataSet(counter == 9);
binnedDataSet(:,10) = dataSet(counter == 10);
binnedDataSet(:,11) = dataSet(counter == 11);
binnedDataSet(:,12) = dataSet(counter == 12)
binnedDataSet = 4×12
36 48 11 NaN NaN 13 10 NaN NaN 22 NaN 46 NaN NaN NaN 19 NaN NaN NaN 16 4 39 NaN NaN 21 NaN 46 NaN 27 44 11 50 NaN 26 31 NaN NaN NaN 44 16 NaN NaN 44 NaN 13 12 NaN 39
% Find Average of each column
avgBinnedDataSet = nanmean(binnedDataSet)
avgBinnedDataSet = 1×12
28.5000 48.0000 33.6667 17.5000 27.0000 28.5000 21.6667 33.0000 8.5000 24.7500 31.0000 42.5000
Simpler MATLAB approach:
tmp = dataSet(:);
tmp(binarySequence==0) = NaN;
out = accumarray(counter(:),tmp,[],@nanmean).'
out = 1×12
28.5000 48.0000 33.6667 17.5000 27.0000 28.5000 21.6667 33.0000 8.5000 24.7500 31.0000 42.5000
  1 commentaire
Anson
Anson le 17 Mar 2023
Modifié(e) : Anson le 17 Mar 2023
Wow, Thanks so much!
accumarray seems to be an incredibly niche yet powerful function.
I wish I knew about this function earlier.
Many thanks again!

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Communications Toolbox dans Help Center et File Exchange

Produits


Version

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by