Extraction of a sub matrix from a mother matrix

2 views (last 30 days)
Hi, I have a matrix A = [0 0 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 0 1]. I want to sum the 1's of its duration so that the result comes as B = [0 0 2 0 0 0 5 0 0 0 0 3 0 0 1]. I need a help in this regard.

Accepted Answer

Jan
Jan on 10 Jan 2018
Edited: Jan on 10 Jan 2018
A = [0 0 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 0 1];
[B, N] = RunLength(A);
match = (B == 1);
B(match) = N(match);
N(match) = 1;
Result = RunLength(B, N);
[EDITED] And after a lot of time and struggling a working loop:
R = zeros(1, numel(A) + 1);
iR = 1;
for k = 1:numel(A)
if A(k) == 0
iR = iR + 1 + (R(iR) ~= 0);
else
R(iR) = R(iR) + 1;
end
end
R = R(1:iR - (R(iR) == 0))
  6 Comments
Amitrajit Mukherjee
Amitrajit Mukherjee on 10 Jan 2018
Edited: Amitrajit Mukherjee on 10 Jan 2018
See, now I actually needed it without downloading any extension..So I would like to prefer the second code which you have suggested..I will also try other codes later..I need a versatile Code which can be used in such computers with no internet..So no option will be there to download any MATLAB function..But other options are also appreciable..Thanks..
Jan
Jan on 11 Jan 2018
@Amitrajit Mukherjee: You can download the files on the computer you use to post in the forum and include the source codes in your program. Copying the code from the forum is not a real difference to copying code from the FileExchange.

Sign in to comment.

More Answers (2)

Birdman
Birdman on 10 Jan 2018
Firstly, download the file from the following link and use rcumsum function within it.
Then, apply the following code:
B=rcumsum(A);
idx=setdiff(find(diff(B)==1),find(diff(B)<0)-1)+1;idx(end)=[];
B(idx)=[]
  7 Comments
Birdman
Birdman on 10 Jan 2018
@Stephen: But there is an improvement, right? :)
Amitrajit Mukherjee
Amitrajit Mukherjee on 10 Jan 2018
Edited: Amitrajit Mukherjee on 10 Jan 2018
Yah there is...Actually I need a versatile Code which can be used in such computers with no internet..So no option will be there to download any MATLAB function..But other options are also appreciable..

Sign in to comment.


Stephen23
Stephen23 on 10 Jan 2018
Download Matt Fig's excellent rcumsum and simply do this:
>> A = [0 0 1 1 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 0 0 1];
>> B = rcumsum(A);
>> B = B(B==0 | [diff(B)<0,true])
B =
0 0 2 0 0 0 5 0 0 0 0 3 0 0 1
  2 Comments
Stephen23
Stephen23 on 10 Jan 2018
@Amitrajit Mukherjee: did you download it, as you were advised to do?

Sign in to comment.

Categories

Find more on MATLAB in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!