array to matrix transformation with size[ length of array , largest element in array]

1 Ansicht (letzte 30 Tage)
I have an array [1 1 2 3 1 2 1 ] I want to generate a matrix of size [7x3] as length of array is 7 and maximum element is 3. for example the output look like this
A=[1 0 0
1 0 0
0 1 0
0 0 1
1 0 0
0 1 0
1 0 0]
showing that the 1st element of array assigns 1 to the corresponding column in A. for example the 1st element is 1 so row 1 and column 1 gets value 1, the 3rd element is 2 so row 3 column 2 gets value 1 and so on. Is there any way to do so? I tried diag[array] but it gives a 7x7 matrix

Akzeptierte Antwort

Stephen23
Stephen23 am 8 Jan. 2017
Bearbeitet: Stephen23 am 8 Jan. 2017
No need to for any ugly loops, just use sub2ind:
>> C = [1,1,2,3,1,2,1];
>> R = 1:numel(C);
>> Z = zeros(R(end),max(C));
>> Z(sub2ind(size(Z),R,C)) = 1
Z =
1 0 0
1 0 0
0 1 0
0 0 1
1 0 0
0 1 0
1 0 0

Weitere Antworten (2)

Image Analyst
Image Analyst am 8 Jan. 2017
Did you try the obvious brute force way:
array = [1 1 2 3 1 2 1 ]
lengthA = length(array)
maxA = max(array)
A = zeros(lengthA, maxA)
for k = 1 : lengthA
A(k, array(k)) = 1;
end
A % Report to the command window

Steven Lord
Steven Lord am 8 Jan. 2017
If you want this to be a full array, use accumarray. If the number of rows and/or columns is expected to be large consider using sparse.
% Full
cols = [1 1 2 3 1 2 1 ];
cols = cols(:);
rows = (1:length(cols)).';
A = accumarray([rows, cols], 1)
% Sparse
cols = [1 1 2 3 1 2 1 ];
S = sparse(1:length(cols), cols, 1)
isequal(A, full(S))

Kategorien

Mehr zu Creating and Concatenating Matrices finden Sie in Help Center und File Exchange

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by