3

I have a cell array which each cell is a point on (x,y) coordination (i.e, the cells are of size [1x2]). Is it possible to change it to matrix that those coordination points to be reserved?

Because when I used cell2mat, the peculiar coordination was change to the size of [1x1] while I need the coordinates.

my cell array is like this: [0,2] [0,2] [1,3] [-13,10] [1,4] [-1,5]

How I can change it to a vector that these coordinates can be used later for plotting?

Amro
  • 123,847
  • 25
  • 243
  • 454
Biju
  • 71
  • 1
  • 2
  • 8

3 Answers3

6
>> myCell = {[1 2],[3 4],[5 6]}; %// example cell. Can have any size/shape
>> result = cell2mat(myCell(:)) %// linearize and then convert to matrix
result =
     1     2
     3     4
     5     6

To plot:

plot(result(:,1),result(:,2),'o') %// or change line spec
Luis Mendo
  • 110,752
  • 13
  • 76
  • 147
4

Another way to accomplish this:

c = {[1 2], [3 4], [5 6]};
v = vertcat(c{:});    % same as: cat(1,c{:})

plot(v(:,1), v(:,2), 'o')

Cell arrays in MATLAB can be expanded into a comma-separated list, so the above call is equivalent to: vertcat(c{1}, c{2}, c{3})

Amro
  • 123,847
  • 25
  • 243
  • 454
  • what about `c= {[1 2 3],[3 4 ],[5 6 5 6 7]}` then how can i convert this cell array to vector? – Muhammad Usman Saleem Dec 05 '17 at 04:41
  • in your case, you can only flatten the cell array into a one-dimensional vector (1x10 vector) as `v = [c{:}]` or `v = cat(2, c{:})`. You see when concatenating arrays, the dimensions must be **consistent**; you can't have a ["jagged"](https://en.wikipedia.org/wiki/Jagged_array) [matrix](https://en.wikipedia.org/wiki/Irregular_matrix) – Amro Dec 05 '17 at 11:43
  • otherwise you can **pad** each cell with NaNs so that all rows have the same length before concatenation. You can find plenty of similar questions here on Stack Overflow, for example this one: https://stackoverflow.com/q/3054437/97160 – Amro Dec 05 '17 at 11:53
0
myCell = {[0,2] [0,2] [1,3] [-13,10] [1,4] [-1,5]};
hold on;
cellfun(@(c) plot(c(1),c(2),'o'),myCell);
Tobias
  • 4,034
  • 1
  • 28
  • 35