matching based on some conditions

1 visualizzazione (ultimi 30 giorni)
Gazi Iqbal
Gazi Iqbal il 6 Lug 2020
Commentato: Gazi Iqbal il 6 Lug 2020
Hi,
I have following D2, CD, T matrix from previous part of the code:
D2 = [1400 2200 1500];
CD = [4000 1200 1500];
T=[ 3 2 1
1 2 3
2 3 1];
Now I want a Z matrix like this:
Z=[ 2 0 1
3 0 0
0 0 0];
Logic is – D2(1,1) will be assigned to CD(1, T(1,1)) only if D2(1,1) <= CD(1,T(1,1)) and then we don’t need to check CD(1,T(1,2)) or CD(1,T(1,3))
If D2(1,1) > CD(1,T(1,1)), then D2(1,1) will be assigned to next CD(1, T(1,j)) for all j = 2 to size(T,2) ; whichever j satisfied this condition:: D2(1,1) <= CD(1,T(1,j))
Same thing for D2(1,2). It will be assigned to CD(1,T(2,1)) only if D2(1,2) <= CD(1, T(2,1))
If D2(1,2) > CD(1, T(2,1)) then D2(1,2) will be assigned to next CD(1, T(2,j)) for all j = 2 to size(T,2) ; whichever j satisfied this condition:: D2(1,2) <= CD(1,T(2,j))
Same thing for D2(1,3) .......
I also need to make sure that capacity of CD doesn’t exceed.
I currently wrote following:
Z=zeros (size(D2,2), size(CD,2));
for i=1:size(D2,2)
for j= 1:size(CD,2)
if D2(1,i) <= CD(1,T(i,j))
Z(i,j)=T(i,j);
else
Z(i,j)=0;
end
end
end
and I get
Z=[ 3 0 0
1 0 0
0 3 0];
WHICH IS DEFINITELY WRONG !!!
Can anyone give me any idea? Thanks in advance.

Risposte (1)

madhan ravi
madhan ravi il 6 Lug 2020
Z = (D2 <= CD(T)) .* T % are you sure about your desired result? , or am I missing some crucial information here
  1 Commento
Gazi Iqbal
Gazi Iqbal il 6 Lug 2020
Thanks for your response. Yes, I am sure about desired result.
in Z : size(Z,2) will be the size(CD,2). and size(Z,1) will be the size of size(D2,2)
T(1,:)=[ 3 2 1] sequence is for D2(1), which means D2(1) will first assign to CD(3) if D2(1) <= CD(3) , if D2(1) > CD(3) then D2(1) will be assigned to either CD(2) or CD(1) whichever satisfies D2 <= CD condition...
T(2,:)= [1 2 3] sequence is for D2(2), which means D2(2) will first assigned to CD(1) if D2(2) <= CD(2), if D2(2) > CD(1) then D2(2) will be assigned to either CD(2) or CD(3) whichever satisfies D2 <= CD
same for T(3,:) =[2 3 1] sequence .....
D2 = [1400 2200 1500];
CD = [4000 1200 1500];
T=[ 3 2 1
1 2 3
2 3 1];
now from my test data: D2(1) [=1400] <= CD(3) [=1500], so Z(1,3)= 1 ; [remaining balance of CD(3)=100]
D2(2) [= 2200] <= CD(1) [=4000], so Z(1,1) = 2 ; [here the reamining 1800 of CD(1) can be used in other assignments if needed and D2 <= CD condition satisfied]
D2(3) [=1500] > CD(2) [=1200], so we cannot assign D2(3) to CD(2). Next we need to check if D2(3) <= CD(3) [=1500] , which is true. but we cannot assign D2(3) to CD(3) because we already used 1400 of CD(3) for D2(1). Next we need to check if D2(3) <= CD(1) [=4000], so Z(2,1) = 3
Final asnwer is CD(1) was assigned to D2(2) and D2(3), CD(2) was not assigned to any D2; aand CD(3) was assigned to D2(1). all these assignments are based on the sequence of each row of T; and final Z would be -
Z=[2 0 1
3 0 0
0 0 0];
If I use your line then I get :
Z=[3 0 1
1 0 3
0 0 1];
we don't have any 2 here and 3 and 1 are repeated. It (1,2,3) cannot repeated in Z matrix.
Soory if I couldn't make my first question clear. Thanks again for your answer.

Accedi per commentare.

Categorie

Scopri di più su Resizing and Reshaping Matrices in Help Center e File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by