# Unknown operation performed.

2 views (last 30 days)
Yulia M on 21 Nov 2019
Edited: Yulia M on 22 Nov 2019
Hi,
I am new to MATLAB. the following is my code I am unable to understand
the operation perfromed B = S(A); and C = S(~A);
B has size 15x1 double
C has size 285x1 double
S is 20x15 double
A is 20x15 logical
my question is what operation has been performed in B and C and how did they get that size?
clear all;
clc;
A = false( 20,9 );
sP = generate_pilots( 15 , 4, 'deterministic' );
G = [4:4:11 12:4:21]';
H = (2:7:20)';
A( G, H-1 ) = true;
S = zeros( size(A) );
B = S(A);
C = S(~A);
D = sP(1:15);
S( A ) = sP(1:15);
Regards,
Gnanesh

Philippe Lebel on 21 Nov 2019
Edited: Philippe Lebel on 21 Nov 2019
This is called logical (or boolean) indexing.
Your A matrix is filled with booleans.
B is now a vector that has all the elements of S that correspond to the same indexes as the Ones in A.
C is now a vector that has all the elements of S that correspond to the same indexes as the Zeros in A.
a = logical([1 0 0 1; 0 0 1 0])
s = [1,2,3,4;5,6,7,8]
s(a)
ans =
1
7
4

Yulia M on 21 Nov 2019
Hi Philippe,
Thank you for your reply. Does this work even if A is not logical??
And another question as well I am confuysed how it gets the sizes? You can see I have mentioned even the size of the matrix I am wondering how they change? It would be helpful if you share some knowledge on it as well. especially B.
regards,
Philippe Lebel on 21 Nov 2019
No, it has to be filled with only booleans.
you can make it by different means:
1: automatically
mat = [1,2,3,4,5];
a = mat<3
a =
1 1 0 0 0
2:manually
a = [true true false flase true];
%or
a = logical([1 1 0 0 1]);
For the sizes of the matrix B and C, take the following example:
A = logical([1 0 0 1; 0 0 1 0]);
S = [1,2,3,4;5,6,7,8];
B = S(A)
B =
1
7
4
B is a 3x1 vector because there are only 3 Ones in A. The logical indexing fetches only 3 elements in S to put them in B.
Yulia M on 22 Nov 2019
Hi Philippe,
I got it. Thank you very much for your valuable time.
regards,