sum only consecutive 1's in matrix

1 次查看(过去 30 天)
C.G.
C.G.2021-10-20
评论: Matt J ,2021-10-20
I have a matrix of data where I want to go down each column in the matrix, and sum the occurences where 1's occur consectively. E.g. if I have
1
0
1
1
0
1
1
I want this to be recorded as 1,2,2 as the groups of 1's are separated by 0's. I want this data to be stored in a new matrix where the sum data for each column is stored in a column (in the same format as the orignal data).
Is this possible?

采纳的回答

Image Analyst
Image Analyst 2021-10-20
This will do it:
% Read in data.
s = load('PNM.mat')
particleNotMoved = s.particleNotMoved
% Prepare a matrix to hold our output -- the run lengths.
[rows, columns] = size(particleNotMoved)
output = zeros(floor(rows/2), columns)
% Loop over all columns, getting the run lengths of each run.
for col = 1 : columns
% Use regionprops in the Image Processing Toolbox.
props = regionprops(logical(particleNotMoved(:, col)), 'Area');
% Get the run lengths for this column.
runLengths = [props.Area]';
% Insert result for this column into our output array.
output(1:numel(runLengths), col) = runLengths;
end
  3 个评论

请先登录,再进行评论。

更多回答(1 个)

Matt J
Matt J 2021-10-20
See,
Tools for Processing Consecutive Repetitions in Vectors
[~,~,runlengths]=groupLims(groupTrue(particleNotMoved),1)
  2 个评论
Matt J
Matt J 2021-10-20
An easy modification.
X=particleNotMoved;
X(end+1,:)=0;
[starts,~,runlengths]=groupLims(groupTrue(X(:)),1);
[~,G]=ind2sub(size(X),starts);
result = splitapply(@(x) {x}, runlengths,G )

请先登录,再进行评论。

Community Treasure Hunt

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

Start Hunting!

Translated by