Converting integer values to logical array

I have a vector (160,1) in size which include integer number from 1 to 4, I want to convert in logical array by replacing 1 to(1 0 0 0), 2 to (0 1 0 0), and so on; for classifiction propblem.

 Akzeptierte Antwort

Image Analyst
Image Analyst am 17 Dez. 2016

1 Stimme

Try this:
m = randi([1, 4], 160, 1)
% Get 3 bit array
characterArray = dec2bin(m)
% Tack on column of 0's to the left edge
characterArray = [repmat('0', 160, 1), characterArray]
logicalArray = logical(characterArray - '0')

5 Kommentare

Image Analyst
Image Analyst am 17 Dez. 2016
I created a "a vector (160,1) in size which include integer number from 1 to 4" just like you said. Apparently you're starting with something else. Please give your code where you create that column vector.
Najiya Omar
Najiya Omar am 17 Dez. 2016
it works perfectly now, i just create differnt size vector to test it, and I forgot to change it in the code.
thanks
To be more robust for different sized vectors, use size() or length() when you call repmat():
m = randi([1, 4], 160, 1)
% Get 3 bit array
characterArray = dec2bin(m)
% Tack on column of 0's to the left edge
characterArray = [repmat('0', length(m), 1), characterArray]
logicalArray = logical(characterArray - '0')
Najiya Omar
Najiya Omar am 17 Dez. 2016
thank you, it's really help
Carlos Orduno
Carlos Orduno am 3 Sep. 2021
Thanks for sharing,
This solution gave an error, so I modified it slighly, just in case someone is having any problem.
% Generate random values
m = randi([1, 4], 160, 1)
% Get 4 bit array
characterArray = dec2bin(m,4)
% convert to logical array
logicalArray = logical(characterArray - '0')

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (3)

Steven Lord
Steven Lord am 28 Aug. 2020

1 Stimme

You can use implicit expansion.
>> r = randi(4, 10, 1); % Your values will vary
>> values = r == 1:4;
>> t = table(r, values)
t =
10×2 table
r values
_ __________________________
1 true false false false
2 false true false false
3 false false true false
4 false false false true
4 false false false true
1 true false false false
4 false false false true
4 false false false true
2 false true false false
4 false false false true
Anthony Bartoletti
Anthony Bartoletti am 14 Okt. 2019
Bearbeitet: Anthony Bartoletti am 14 Okt. 2019

0 Stimmen

I'm not sure this is the answer requested. The solution given turns
1 into ( 1 0 0 0 ), 2 into ( 0 1 0 0 ), 3 into ( 1 1 0 0 ), 4 into ( 0 0 1 0 ).
But for a classification problem, you want to turn
1 into ( 1 0 0 0 ), 2 into ( 0 1 0 0 ), 3 into ( 0 0 1 0 ), 4 into ( 0 0 0 1 ).
I managed a solution: Create a logical 4x4 identity matrix with I = logical(eye(4)). Then given a sequence (row) r of integers 1 <= n <= 4, conduct
M = I( :, r)
This will select from the 4 logical basis vectors as columns, according to the sequence r.
Deryck Chan
Deryck Chan am 28 Aug. 2020

0 Stimmen

I've combined the two approaches above and came up with this rather elegant solution:
% Example input
y = [1 3 4 5 7 9 8 2 1 5 10 3 4 6 8 2 6 1 2 7 10];
num_labels = max(y)
% Convert y into y_matrix
logic_template = eye(num_labels);
y_matrix = logic_template(:, y);
You can use boolean(eye(num_labels)) instead of eye(num_labels) if you want the result to be in the logical datatype.

Kategorien

Tags

Community Treasure Hunt

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

Start Hunting!

Translated by