find variables in a matrix with multiple conditions
조회 수: 5 (최근 30일)
이전 댓글 표시
Hello everyone,
I have an array of elements, lets say A = 1000x1 wich contains only 0,1, 2 and 3 only. I need to find (storee in variables) and plot
- where the 0 is repeated four or more time in a row (eg. 1 0 0 0 0 0 0 1 0 0 1 2 3). In this examaple, the only sequence to be retained is formed by the six zeros.
- where there are 2 or 3's repeated for three or more time in a row (eg. 1 0 1 0 1 1 2 3 3 3). In this example the only sequence to be retained is 2 3 3 3
please find the original matrix in the attachments.
for the following example I would like to have this kind of plot:
where the zero's condition is satisfied the plot goes up (let's say plus 1), no condition satisfied the plot stays in the base line (let's say 0), and finally when the 2 and 3's condition is satisfied the plot goes down (let's say at ,minus 1).
Thanks in advance for you help. This community is really amazing
댓글 수: 0
채택된 답변
Dyuman Joshi
2023년 10월 6일
편집: Dyuman Joshi
2023년 10월 6일
I have written a function to check for the criteria you have mentioned.
You can also check out this FEX submission for the same - RunLength
%Random input
A = [1 0 0 0 0 0 2 3 1 0 0 0 0 0 0 0 2 3 3 3 0 3 1 2 2 2 2 1 1 1 3 3 3];
%Corresponding outputs
out1 = convert(A,0,4);
out2 = convert(A,[2 3],3);
% +1 for 0
% -1 for [2 3]
out = 1*out1+(-1)*out2;
vec = 1:numel(A);
%plot using stairs to get the square wave form
stairs(vec,out)
grid on
ylim([-2 2])
xticks(vec)
%% Function to check for groups of consecutive apperances above a threshold
function out = convert(in,val,thresh)
%% in - input array (expected to be a vector)
%% val - values to check for as a part of a cluster (expected to be a vector)
%% thresh - threshold for elements in a cluster (expected to be a scalar)
%% out - output (row vector) = 1 for the elements of groups that satisfy the criteria, 0 otherwise
%Check for input
if ~isvector(in)
error('Input array must be a vector');
end
%Check for values
if ~isvector(val)
error('Values must be a vector');
end
%Check for threshold
if ~isscalar(thresh)
error('Threshold must be a scalar');
end
%Convert the input to a row vector
in = reshape(in,1,[]);
%Lazy way of preallocating output
out = 0*in;
%Check for values present in the input
idx=ismember(in,val);
%Starting index of a cluster
ij1=strfind([0 idx 0],[0 1]);
%Ending index of a cluster
ij2=strfind([0 idx 0],[1 0])-1;
%Cluster with members more than a threshold
temp=find((ij2-ij1+1)>=thresh);
%Set the corresponding output as 1
for k=1:numel(temp)
out(ij1(temp(k)):ij2(temp(k)))=1;
end
end
추가 답변 (0개)
참고 항목
카테고리
Help Center 및 File Exchange에서 Detection에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!