question about indexing of logic matrix

2 Ansichten (letzte 30 Tage)
Yu Li
Yu Li am 2 Okt. 2019
Kommentiert: Yu Li am 2 Okt. 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

Akzeptierte Antwort

Stephen23
Stephen23 am 2 Okt. 2019
Bearbeitet: Stephen23 am 2 Okt. 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 Kommentare
Adam Danz
Adam Danz am 2 Okt. 2019
Bearbeitet: Adam Danz am 2 Okt. 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 am 2 Okt. 2019
thank you all very much!
Bests,
Yu

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

Steven Lord
Steven Lord am 2 Okt. 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 Kommentar
Yu Li
Yu Li am 2 Okt. 2019
Hi Steven:
thank you all the same!
Bests,
Yu

Melden Sie sich an, um zu kommentieren.

Community Treasure Hunt

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

Start Hunting!

Translated by