question about indexing of logic matrix

2 vues (au cours des 30 derniers jours)
Yu Li
Yu Li le 2 Oct 2019
Commenté : Yu Li le 2 Oct 2019
Hi:
I read through the blog presented in link:
there is an operation using command:
mask(hel.faces)
Where hel.faces is a m*3 matrix, and mask is a n*1 logic matrix. I could not understand how could this operation happens because it can not reproduce in my side. my test commands are:
A=rand(20,3);
B=rand(20,1);
C=B>0.5;
C(A)
could anyone give me some suggestions?
Thanks!
Yu

Réponse acceptée

Stephen23
Stephen23 le 2 Oct 2019
Modifié(e) : Stephen23 le 2 Oct 2019
Your mistake is on this line:
A=rand(20,3);
You correctly wrote that "hel.faces is a m*3 matrix", but you seem to have missed that its values are all indices, i.e. positive integers, with values from 1 to numel(mask):
>> numel(mask)
ans =
121368
>> max(hel.faces(:))
ans =
121368
>> min(hel.faces(:))
ans =
1
>> find(mod(hel.faces(:),1)) % only integers
ans =
Empty matrix: 0-by-1
That is why it can be used as an index into another array (e.g. mask): because it it contains indices.
But you generated A with random numbers between 0 and 1, which are not indices (indices must be positive integers). Once you generate A with positive integers, with values from 1 to numel(B), then your code will work:
>> B = rand(20,1);
>> A = randi([1,20],20,3);
>> C = B>0.5;
>> C(A)
ans =
0 1 0
1 1 0
0 0 0
1 0 0
0 1 1
0 1 1
1 1 0
1 1 0
0 1 0
1 0 0
1 0 0
1 0 0
0 0 0
1 1 1
1 0 1
0 1 0
0 1 1
0 0 0
1 1 1
1 1 1
  3 commentaires
Adam Danz
Adam Danz le 2 Oct 2019
Modifié(e) : Adam Danz le 2 Oct 2019
My answer moved here as a supplement to Stephen's answer.
" Where hel.faces is a m*3 matrix, and mask is a n*1 logic matrix. I could not understand how could this operation happens"
In that blog article, mask is a [121368 x 1] logical vector and hel.faces is a [239778, 3] matrix of integers. Note that the range of values in hel.faces is
min(hel.faces(:)) % = 1
max(hel.faces(:)) % = 121368 = numel(mask)
These values are linear indices of the mask vector. Here's a demo with a smaller amount of data to illustrate this point:
a = -3:6;
b = [4 7 7
5 6 3
6 3 1];
a(b)
ans =
0 3 3 % a(4) a(7) a(7)
1 2 -1 % a(5) a(6) a(3)
2 -1 -3 % a(6) a(3) a(1)
Yu Li
Yu Li le 2 Oct 2019
thank you all very much!
Bests,
Yu

Connectez-vous pour commenter.

Plus de réponses (1)

Steven Lord
Steven Lord le 2 Oct 2019
This is linear indexing into a logical array.
A = [true false]
B = randi(2, 5, 5)
C = A(B)
The elements of C that are true (A(1)) correspond to elements in B that are 1.
The elements of C that are false (A(2)) correspond to elements in B that are 2.
Perhaps a different example, one that has a few more unique values from which to select, would illustrate the technique more clearly.
D = ["Ace of spades"; "Queen of hearts"; "7 of diamonds"; "Jack of clubs"]
selection = randi(numel(D), [4 4])
selectedCards = D(selection)
Element 11 of selectedCards is the element in D whose index is stored in element 11 of selection.
  1 commentaire
Yu Li
Yu Li le 2 Oct 2019
Hi Steven:
thank you all the same!
Bests,
Yu

Connectez-vous pour commenter.

Catégories

En savoir plus sur Logical 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!

Translated by