matlab cell array indexing
5 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Hello guys. Please forgive me if my question seems unclear as i am stiill finding my way through MATLAB. Say, i have a very large matrix , say M=rand(10,3).
M =
0.4464 0.4270 0.5464
0.1115 0.5055 0.2758
0.8828 0.0410 0.4191
0.7399 0.6778 0.9463
0.0032 0.8740 0.1323
0.1920 0.7142 0.4295
0.1379 0.5208 0.9257
0.0943 0.5353 0.8351
0.0390 0.7384 0.9540
0.6558 0.7057 0.4356
I also have some other matrixes which are subsets of the first and second column of M only i.e
C1 =
0.1115 0.5055
0.8828 0.0410
C2 =
0.1379 0.5208
0.0943 0.5353
How do i index into M to extract the third column of M that is equaivalent to elements of C1. i.e expected output should be:
new_C1 =
0.1115 0.5055 0.2758
0.8828 0.0410 0.4191, .
new_C2 =
0.1379 0.5208 0.9257
0.0943 0.5353 0.8351
Also if C1,C2,...Cn are in a cell array, how can i use a for loop to obtain new_C1 and new_C2.
Many thanks
0 commentaires
Réponse acceptée
Guillaume
le 2 Avr 2019
I'm assuming your C1 and C2 are not actual numbered variables but elements of a cell array, in which case:
newC = cellfun(@(c) M(ismember(M(:, [1 2]), c, 'rows'), :), C, 'UniformOutput', false);
Or as a loop:
newC = cell(size(C))
for idx = 1:numel(C)
c = C{idx};
newC{idx} = M(ismember(M(:, [1 2]), c, 'rows'), :);
end
This also assumes that the elements of C originally started as elements of M. If the elements of M and C have been obtained separately, e.g, by mathematical operations, it may well be that the 0.8828 in M is not exactly the same as the 0.8828 in M (but the difference is so small that you don't see it at the displayed precision). If that assumption is broken you will want to use ismembertol instead of ismember. The 'rows' option of ismember becomes 'ByRows', true with ismembertol.
Plus de réponses (1)
Adam Danz
le 2 Avr 2019
Modifié(e) : Adam Danz
le 2 Avr 2019
[EDIT]: This only works with matrices (not cell arrays). I didn't notice the cell array term in the title of the question.
Use ismember() with 'rows' specification to search for C1 within the first two columns of M. That produces a logical index of rows that match C1 which can be used to pull out valules in column 3.
C1 = [C1, M(ismember(M(:,[1:2]), C1, 'rows'),3)];
C2 = [C2, M(ismember(M(:,[1:2]), C2, 'rows'),3)];
Note that if a row in C1 exists more than once in M, this simple method will cause an error (as will other solutions provided here).
0 commentaires
Voir également
Catégories
En savoir plus sur Matrix Indexing dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!