3 views (last 30 days)

Is there a convenient way to convert a 2 column matrix into a cell array (without using nested for loops if possible)?

The matrix looks like:

Can I make a matrix from the above matrix such that the rows and columns of the new matrix(or a cell array you can say) will be like you see below:

the empty cells can be NAN and the filled cells are the values of the 3rd column of the old matrix.

Walter Roberson
on 30 Dec 2019

result = accumarray(matrix(:,[2 1]), matrix(:,3), [], @(v) {v}, {nan})

However I wonder if you would be better off using

result = sparse(matrix(:,2), matrix(:,1), matrix(:,3))

which would be a sparse numeric array instead of a cell array that takes up about 108 bytes per entry.

Bhaskar R
on 30 Dec 2019

Andrei Bobrov
on 30 Dec 2019

[i,g] = findgroups(matrix(:,2));

out = flip(accumarray([matrix(:,1),i],matrix(:,3)),1);

Sign in to comment.

Andrei Bobrov
on 31 Dec 2019

T = readtable('path\to\your\xls\file\matrix.xlsx','ReadVariableNames',0);

T.Var3 = str2double(T.Var3);

T = T(any(T{:,1:2} ~= 0,2),:);

M = T{:,:};

[i,g] = findgroups(M(:,2));

out = flip(accumarray([M(:,1),i],M(:,3)),1);

Andrei Bobrov
on 31 Dec 2019

T = readtable('C:\Octavework\forums\xls\matrix_v2.xlsx','Range','A:C','ReadVariableNames',0);

T.Var3 = str2double(T.Var3);

T = T(any(T{:,1:2} ~= 0,2),:);

M = T{:,:};

i = findgroups(M(:,2));

out = flip(accumarray([M(:,1),i],M(:,3)),1);

Sign in to comment.

Sign in to answer this question.

Opportunities for recent engineering grads.

Apply Today
## 0 Comments

Sign in to comment.