Matrix manipulation / if else loops
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
Laura Steel
am 19 Jan. 2023
Kommentiert: Laura Steel
am 21 Jan. 2023
Hi,
I would like to scan through each row of my data matrix (made of 0s and 1s only) and create a new matrix following the rules below:
- If all columns are 0 - assign 0s to new matrix
- If all columns are 1s - assign 1 to column 2 and 0s to column 1 and 3 of new matrix
- If two columns = 1, then:
- scan up to rows above until you reach a 0 in one of the two columns.
- assign a 1 to the column in the new matrix that was on 0 most recently.
- If both were on 0 equally recently, then assign 1 to both columns.
- (Can assume that first row will be 0 0 0)
This is the code I have so far, but I am struggling on the last section (if two columns both = 1)... any help would be most appreciated. Thank you!
matrix = [0 0 0; 1 0 0; 1 1 0; 1 0 0; 1 0 0; 1 1 1; 0 1 1; 0 1 1; 1 1 1; 1 1 0; 1 1 0; 1 0 0; 1 1 0; 1 0 0]; % data matrix
A = zeros(size(matrix)); % new matrix of 0s to ammend, same size as data matrix
for i = 1:length(matrix(:,1)) % iterate through every row in the data matrix
if sum(matrix(i,:))==0; % if all the columns = 0, assign all columns in new matrix to 0
A(i,:)=0;
elseif sum(matrix(i,:))==3; % if all the columns = 1, assign atrium column in new matrix to 1 and the others to 0
A(i,2)=1;
elseif sum(matrix(i,:))==1; % if only 1 column = 1, assign this column in new matrix to 1 and the others to 0
idx = find(matrix(i,:)); % (find which column it is that =1)
A(i,idx) = 1; % (assign corresponding column in new matrix to 1)
else sum(matrix(i,:))==2; % if two columns =1
idx = find(matrix(i,:)); % find the index of the nonzero elements in this row
idx_1 = (matrix(i-1,idx(1))); % find the values of the row above elements in these columns
idx_2 = (matrix(i-1,idx(2)));
if idx_1 ==0 % if the element in the row above = 0, then assign a 1 to the corresponding column in row i
A(i,idx(1))=1;
if idx_2 ==0 % if the element in the row above = 0, then assign a 1 to the corresponding column in row i
A(i,idx(2))=1;
end
end
end
end
0 Kommentare
Akzeptierte Antwort
David Hill
am 19 Jan. 2023
Bearbeitet: David Hill
am 20 Jan. 2023
Misunderstood you previously.
m = [0 0 0; 1 0 0; 1 1 0; 1 0 0; 1 0 0; 1 1 1; 0 1 1; 0 1 1; 1 1 1; 1 1 0; 1 1 0; 1 0 0; 1 1 0; 1 0 0];
s=sum(m,2);
M=zeros(size(m));
M(s==3,2)=1;
M(s==1,:)=m(s==1,:);
f=find(s==2);
for k=1:length(f)
F=find(m(f(k),:));
t=M(1:f(k)-1,F);
f1=find(~t(:,1),1,'last');
f2=find(~t(:,2),1,'last');
if f2>f1
M(f(k),F(2))=1;
elseif f2==f1
M(f(k),F)=1;
else
M(f(k),F(1))=1;
end
end
M
3 Kommentare
Voss
am 20 Jan. 2023
Replace
t=M(1:f(k)-1,F);
f1=find(t(:,1),1,'last');
f2=find(t(:,2),1,'last');
with
t=m(1:f(k)-1,F);
f1=find(t(:,1)==0,1,'last');
f2=find(t(:,2)==0,1,'last');
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!