Reforming index without using loops

16 visualizaciones (últimos 30 días)
Anson
Anson el 17 de Mzo. de 2023
Editada: Anson el 17 de Mzo. de 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

Respuesta aceptada

Stephen23
Stephen23 el 17 de Mzo. de 2023
Editada: Stephen23 el 17 de Mzo. de 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 comentario
Anson
Anson el 17 de Mzo. de 2023
Editada: Anson el 17 de Mzo. de 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!

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Communications Toolbox en Help Center y File Exchange.

Etiquetas

Productos


Versión

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by