selecting rows from C with associated values in D, while using A and B values as references to produce E and F matrices

1 Ansicht (letzte 30 Tage)
Hi everyone, I have 2 matrices, A and B, that I want to use as reference to draw out certain rows in C and attached associated values from D.
A = [1 2];
B = [1 3];
C = [ 1 19 18 4 3 0 0 0 0 0 0
1 19 2 17 6 7 5 4 3 2 0
1 16 15 17 6 7 5 4 3 2 0
1 19 2 3 0 0 0 0 0 0 0
1 16 15 14 9 8 7 5 4 3 2
1 16 15 14 9 6 5 4 3 2 0
1 2 3 0 0 0 0 0 0 0 0
];
D = [0.1
0.3
0.4
0.8
0.9
0.11
0.2
];
my end results for E and F should be:
E = [0.1 1 19 18 4 3 0 0 0 0 0 0
0.8 1 19 2 3 0 0 0 0 0 0 0
0.2 1 2 3 0 0 0 0 0 0 0 0
];
F = [0.3 1 19 2 17 6 7 5 4 3 2 0
0.4 1 16 15 17 6 7 5 4 3 2 0
0.9 1 16 15 14 9 8 7 5 4 3 2
0.11 1 16 15 14 9 6 5 4 3 2 0
];
  2 Kommentare
JL
JL am 14 Sep. 2019
Bearbeitet: JL am 14 Sep. 2019
Hi Madhan, so basically, put them on E and F based on their first and last number (ignore zero in each rows). For examples, for [1 3], I select the rows in C to put in E with a row starting with 1 and ending with 3 (like I said, ignore zeros)

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Bruno Luong
Bruno Luong am 14 Sep. 2019
Bearbeitet: Bruno Luong am 14 Sep. 2019
A = [1 2];
B = [1 3];
C = [ 1 19 18 4 3 0 0 0 0 0 0;
1 19 2 17 6 7 5 4 3 2 0;
1 16 15 17 6 7 5 4 3 2 0;
1 19 2 3 0 0 0 0 0 0 0;
1 16 15 14 9 8 7 5 4 3 2;
1 16 15 14 9 6 5 4 3 2 0;
1 2 3 0 0 0 0 0 0 0 0
];
D = [0.1;
0.3;
0.4;
0.8;
0.9;
0.11;
0.2
];
[i,j] = find(C);
getC = @(pickfun) C(sub2ind(size(C),(1:size(C,1))',accumarray(i(:),j(:),[],pickfun)));
filtFun = @(x) ismember([getC(@min),getC(@max)],x,'rows');
b = filtFun(B);
E = [D(b,:),C(b,:)]
b = filtFun(A);
F = [D(b,:),C(b,:)]

Weitere Antworten (1)

per isakson
per isakson am 14 Sep. 2019
Bearbeitet: per isakson am 15 Sep. 2019
The script
%%
ixe = [1,4,7];
E = cat( 2, D(ixe), C(ixe,:) );
ixf = setdiff( [1:7], ixe );
F = cat( 2, D(ixf), C(ixf,:) );
calculates E and F that agrees with your sample.
However, I cannot see how the rows 1, 4 and 7, honors the rules you provide in your comment.
In response to comment
ixe = find_rows( C, B );
E = cat( 2, D(ixe), C(ixe,:) );
ixf = find_rows( C, A );
F = cat( 2, D(ixf), C(ixf,:) );
%
function ix_rows = find_rows( C, FL );
ix_rows = nan( 1, size(C,1) );
for jj = 1 : size( C, 1 )
row = C(jj,:);
row(row==0) = [];
if row(1)==FL(1) && row(end)==FL(2)
ix_rows(jj) = jj;
end
end
ix_rows( isnan( ix_rows ) ) = [];
end
  1 Kommentar
JL
JL am 14 Sep. 2019
Hi isakson, can it select automatically rather than selecting 1 4 7 to put to E then putting the rest in F? The reason being, I have 3000 over rows and they are not just for E and F.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Startup and Shutdown 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!

Translated by