One way to solve this problem is to construct a sparse matrix S such that the element S(i,j) is logical true if the vertex V(i,:) is contained in the cell C{j}. Then, to see to which cells a vertex V(i,:) belongs, you could simply type S(i,:) to display the indices. This will also use minimal memory, given that the data size may be very large.
To construct the sparse matrix, as discussed in the documentation, you will need to supply the row and column indices of the elements you wish to set to true, as well as the matrix sizes. The call will then look something like this:
S = sparse(ix, jx, true, size(V, 1), size(C, 1));
The first argument ix is a list of indices of vertices, and the second argument jx is a list of the indices of cells containing those vertices. The last two input arguments give the matrix size.
Using the example you provided, I get:
>> C{1}
ans =
1 3
>> C{2}
ans =
8 1 3 4
In this case, the first 6 elements of your arrays ix and jy would be
ix(1:6) == [1 3 8 1 3 4]
jy(1:6) == [1 1 2 2 2 2]
You can construct these two arrays efficiently. First, by making use of comma-separated lists, you can generate the ix array:
ix = [C{:}]';
This concatenates the contents of each cell in C into a single column vector. It is a little trickier to create the jy array, but it is still possible to do so efficiently using the functions cellfun, cumsum, nnz, and arrayfun:
cellLengths = cellfun(@length, C);
cs = cumsum(cellLengths);
jy = arrayfun(@(k) nnz(cs < k), (1:cs(end))) + 1;
These three lines are equivalent to computing jy by
jy = [ones(length(C{1}), 1); ones(length(C{2}), 1); ...]
Once you have these two index arrays, you can create the sparse matrix S and thus determine which cells use which vertices.