finding a value in a column

조회 수: 17 (최근 30일)
Jason
Jason 2011년 9월 29일
I have two separate matrices A and B. I am taking data from A and putting it into B. There is a specific order in which I can move the Data from A to B so I have to first check B to make sure the proper sequence if followed. How do I check B to see if the a value in A exists in B. For example. I have A = [14,9]of a give set of data and B= zeros[14,3]. I am taking data from A and placing it in B, but I have to move them in a certain order. I have to check conditions in columns 3-7 of A of a given row to make sure those values are already present in column 1 of B. I am trying to use the find() function but it does not seem to be working. Please keep in mind that I am very much a novice so be kind when telling me how amateur my code looks.
function LCR
format bank
a = load('Assembly I.txt');
fid = fopen('Assembly Ib.txt');
b = textscan(fid,'%s');
E = .88; %line efficiency
Ot = sum(a(:,2)) %operational time of all elements
Fp = 400; %forcast production
At = 8*60; %work shift(in minutes)
Tc = At/Fp %Time cycle
Ns = round(Ot/(Tc*E)) %Number of work stations
Dly = 100-(E*100); %Delay percentage
j = 1;
[p,q] = sort(a(:,2),'descend'); % Please look the syntax up in the help file
a(:,[1:end]) = a(q,[1:end]); % What I have done is that I have just arranged the observations in the order of their decreasing time
n = length(a);
t = Ot;
ws = 1;
station = zeros(14,3);
newt = 0;% remaining time at station
newt1 = newt;
j=1;
while n > 0
for i = 1:n;
while newt < Tc;
if a(i,2)< Tc
if all( ismember(a(i,3:7), station(:,2)) )
station(j,1)= ws;
station(j,2)= a(i,1);
station(j,3)= a(i,2);
newt = newt1 + a(i,2);
newt1 = newt;
n = n-1;
j=j+1;
break
end
end
end
ws = ws + 1;
end
end
end
  댓글 수: 2
Andrew Newell
Andrew Newell 2011년 9월 29일
See http://www.mathworks.com/matlabcentral/answers/7885-tutorial-how-to-format-your-question for how to format the code.
Jason
Jason 2011년 9월 29일
I do apologize for the poor formatting. I tried to change it but did not know how. Thank you for posting the link for future reference.

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

답변 (1개)

Walter Roberson
Walter Roberson 2011년 9월 29일
find() returns an index, but you just want to know if the value is present (I think)
It looks to me as if you could replace your 5 inner "if" tests with the single test:
if all( ismember(a(i,3:7), station(:,2)) )
  댓글 수: 9
Walter Roberson
Walter Roberson 2011년 9월 29일
You loop for i = 1:n, and you index a(i), but inside that loop you delete rows, a(i,:)=[] . When you delete the row, that reduces the number of rows in the matrix, so if you ever actually delete anything, when i reaches n, a(i,:) will no longer exist.
In situations where you are deleting rows, it is usually better to run the loop backwards, starting from the end, so that the rows that "fall down" to occupy the removed space will be rows you have already processed, and your future processing will head towards earlier rows that have never been moved.
If you have not encountered this problem, then either you have never deleted anything or your infinite loop is "tighter" than getting around to further i values.
You appear to have tried to deal with this by decreasing n. That will not work. The "for" loop copies the range (or values) at the beginning of the loop; changes to any variables named in the "for" statement have no effect on the number of iterations.
Jason
Jason 2011년 9월 29일
What would happen if I zero the used rows? I dont know how to do what you are suggesting.

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

카테고리

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

Community Treasure Hunt

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

Start Hunting!

Translated by