# Get every 4 values of a vector and change values

2 views (last 30 days)
Hi all,
I have a vector like this
a= [1 1 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0]
So I would like to take every four values in a group, check if there are any ones in it, and if yes change the four values to 1. otherwise leave zeros.
So the desired vector will be:
b= [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1]
can you help me with that?
Nikolas

DGM on 4 Jan 2022
Edited: DGM on 4 Jan 2022
Maybe something like this
a = [1 1 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0]
a = 1×24
1 1 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0
b = repelem(any(reshape(a,4,[]),1),4)
b = 1×24 logical array
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1
I'm assuming the input is nominally binarized already (i.e. either logical class or numeric class but integer-valued and constrained to [0 1]). If otherwise, you'll have to explicitly convert it to logical using some desired test.
If the output needs to be numeric class, cast it using double().
Nikolas Spiliopoulos on 4 Jan 2022
thanks it works!!

KSSV on 4 Jan 2022
a = [1 1 0 0 1 1 1 1 0 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0] ;
b = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1] ;
idx = bsxfun(@plus, (1 : 4), (0 : numel(a) - 4).');
a = a(idx) ;
iwant = any(a,2)'
iwant = 1×21 logical array
1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1