bla
bla

Reputation: 26069

linear indexing for cell array elements in matlab

Consider the following cell array:

A={1:3,[20,40],100}

A =

1×3 cell array

   {1×3 double}    {1×2 double}    {[100]}

I'd like a way to retrive the linear index of the values stored it, for example if I flatten the array using:

[A{:}]

ans =

     1     2     3    20    40   100

I can see that the 4th linear index is 20 etc. So is there a way similar the matrix linear index that will give me for a cell array A((4)) the value 20 in the example? (I of course just invented the (()) notation for illustration purposes.

Upvotes: 3

Views: 701

Answers (2)

Luis Mendo
Luis Mendo

Reputation: 112659

There isn't a straightforward solution, as far as I know. Here's a way to achieve that. It works even if the inner arrays are not row vectors; in that case they are implicitly considered to be linearized.

A = {1:3,[20,40],100}; % data
ind = 4; % linear index into flattened data
s = [0 cumsum(cellfun(@numel, A))];
ind_outer = find(ind<=s, 1) - 1;
ind_inner = ind - s(ind_outer);
result = A{ind_outer}(ind_inner);

Upvotes: 5

Tommaso Belluzzo
Tommaso Belluzzo

Reputation: 23675

If you don't want to convert your cell array of matrices into a straight numerical matrix, it's hard to determine the linear index to a specific element of a specific matrix since you don't know the "full size" if your data.

You can retrieve elements of matrices within your cell arrays:

value = A{1,2}(1,1) % 20

That gets the the underlying value of the second cell in the first row of cells ({1,2}) and retrieve the element in the first row and column ((1,1)). If you want, you can rewrite the command so that it takes into account only a single dimension:

value = A{2}(1) % 20

Upvotes: 0

Related Questions