question about indexing of logic matrix
2 views (last 30 days)
Show older comments
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
0 Comments
Accepted Answer
Stephen23
on 2 Oct 2019
Edited: Stephen23
on 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 Comments
Adam Danz
on 2 Oct 2019
Edited: Adam Danz
on 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)
More Answers (1)
Steven Lord
on 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.
See Also
Categories
Find more on Logical in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!