best way to update items in arrays value based on -1 and 1

조회 수: 2 (최근 30일)
Rizwan Khan
Rizwan Khan 2022년 1월 2일
댓글: Rizwan Khan 2022년 1월 2일
I have the following arrays
The first arr (ArrA), that is the input
The second arr (ArrB) that is the desired results.
Now the logic is that when it see's a 1, the value continues to be a 1, until some new (nonzero) number is found.
When it then sees the new number (eg -1), the following values are then -1, until a new (nonzero) value is found.
So basically it start with 0, 0, 0, it then see's a 1, so the value is 1, until it finds a -1, when it finds that the values are -1 until it finds a 1, and so on.
Numbers int his array will always be either 0, 1, -1.
Now i've been thinking of loops and stuff, but it all seems very complicated with loops within loops
so any help will be appreciated.
ArrA = [0,0,0,1,0,1,0,-1, 0, 0,-1, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, 0];
ArrB = [0,0,0,1,1,1,1,-1,-1,-1,-1,-1 -1, 1, 1, 1, 1, 1, 1, -1, -1, -1];

채택된 답변

Image Analyst
Image Analyst 2022년 1월 2일
This will do it, if you have the Image Processing Toolbox.
ArrA = [0,0,0,1,0,1,0,-1, 0, 0,-1, 0, 0, 1, 0, 0, 0, 1, 0, -1, 0, 0];
ArrBRef = [0,0,0,1,1,1,1,-1,-1,-1,-1,-1 -1, 1, 1, 1, 1, 1, 1, -1, -1, -1]
ArrBRef = 1×22
0 0 0 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1
% Initialize output array
ArrB = ArrA;
props = regionprops(ArrA == 0, 'PixelList'); % Get indexes of each group of zeros.
% Loop over each group, reassigning zeros to the value prior to the zeros.
for k = 1 : length(props)
theseIndexes = props(k).PixelList(:, 1); % Get indexes for this group only.
% Skip the set of 0's if it's at the beginning because there is no prior value.
if theseIndexes(1) == 1
continue; % Skip to bottom of loop.
end
% Set values at these indexes equal to the prior value.
ArrB(theseIndexes) = ArrB(theseIndexes(1) - 1);
end
ArrB % Display in command window.
ArrB = 1×22
0 0 0 1 1 1 1 -1 -1 -1 -1 -1 -1 1 1 1 1 1 1 -1 -1 -1

추가 답변 (2개)

Rik
Rik 2022년 1월 2일
Use find to find out how many leading zeros you have. Then set all zeros to 1 and use cumprod. Then set the leading zeros as required.
There is probably a more efficient way to do this, but this will get you most of the way there.
  댓글 수: 2
Rizwan Khan
Rizwan Khan 2022년 1월 2일
Thanks for your help, however, setting all zeros to one 1 does not solve the problem.
Some of the zeros will become a 1, while others need to be -1.
So i'm unsure how your suggested approach will resolve it for me.
Rik
Rik 2022년 1월 2일
That is what the cumprod is for.
% if this is your array:
% [1 0 -1 0]
% then this will be the result of the cumprod call
cumprod([1 1 -1 1])
ans = 1×4
1 1 -1 -1
Although I now realise that this will not work if you have multiple -1 in a stretch:
% [1 0 -1 0 -1]
cumprod([1 1 -1 1 -1])
ans = 1×5
1 1 -1 -1 1

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


Walter Roberson
Walter Roberson 2022년 1월 2일
You do not need loops within loops.
Keep a single variable that records what you are currently converting 0 to.
Scan. At each position, if the input is 1, output is 1, record that you are converting to 1. If the input is -1, output is -1, record that you are converting to -1. Otherwise, input must be 0, and output the recorded value.
WIth some work you can get it down to a single comparison for each input character.

카테고리

Help CenterFile Exchange에서 Structures에 대해 자세히 알아보기

태그

제품


릴리스

R2021a

Community Treasure Hunt

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

Start Hunting!

Translated by