22 views (last 30 days)

Show older comments

If I have an array such as:

R = [0, 0, 4, 0, 1, 0, 0, 0, 0, 6];

I want to code it so that all elements are checked and if the number in that element is greater than the gap between it and the next non-zero element, it is reduced to the (gap distance minus 1)

IE, R(1), R(2) etc are 0 so remains 0. R(3) is checked to be 4, has a distance of 2 until the next non-zero entry so is reduced to 1. R(5) is checked to be 1, there is no non-zero entry within 1 space so it remains 1. R(10) is 6 and has a distance of 3 until the next non zero entry so is reduced to 2. etc

Sorry if that's poorly explained. I'm very new to Matlab and this one has stumped me so any help or starting points will be appreciated.

the cyclist
on 16 May 2021 at 22:19

Edited: the cyclist
on 16 May 2021 at 22:22

I think this does what you want:

% Original data

R = [0, 0, 4, 0, 1, 0, 0, 0, 0, 6];

% Identify the non-zero elements of R

isNonZero = R>0;

nonzeroR = R(isNonZero);

% The positional index of the non-zero elements

nonZeroIndex = find(isNonZero);

% Calculate the gaps

gap = [diff(nonZeroIndex) (nonZeroIndex(1)+numel(R))-nonZeroIndex(end)];

% Reduce the non-zero values of R to (gap-1)

newNonZeroR = min(nonzeroR,gap-1);

% Re-insert the new values into the vector

R(isNonZero) = newNonZeroR;

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

Start Hunting!