Generate a comma-separated list from a numeric array?
Show older comments
Is there a way to generate a comma-separated list from a numeric array without generating a temporary cell array? If not, would you find this functionality useful if it was added to MATLAB?
I know I would - the times that I've wanted to use this construct are very similar to the times that you use {:} with a cell array. For instance, you may have a set of n values in an array A that you want to pass to a function that takes varargin arguments. Right now if you had a cell array C you could do func( C{:} ), but you can't do func( A(someSyntax) ) . Similarly sometimes you want to be able to generate a CSL as an output argument list. Also, sometimes you might want to do B = {1, 2, C{:}, 'foo'}, which is different than B = {1, 2, A(:), 'foo'}. Lastly, you can't do things like a = 3; b=2; c=1; lol = [1 2 3]; [a b c] = deal( lol(someSyntax) )
6 Comments
Apart from your last example (see my Answer below for that), I wouldn't really see much use in creating a CSL from a numeric array. When passing variables as input to functions, it seems more compact to keep them bundled as vectors/matrices if they can exist that way. That also facilitates vectorization. CSL expansion is mainly meant for passing data of different types and sizes that can't co-exist in anything but a cell array.
Your real problem seems to be the habit of defining functions with varargin input syntax when 1 vector input argument would be enough.
Eric Sampson
on 20 Mar 2013
Matt J
on 21 Mar 2013
I see what you mean, but then I question whether you should be maintaining your data in matrix form, rather than cell form. If you plan to apply CSL to that data, it may mean that it should have been a cell array to begin with.
I came across this post trying to do something different. The context in which I want to convert a vector to a CSL is for something of the form
[arr.field] = V{:}
where V is the cell array that I create from a vector (from vectorised operations, so it can't be stored as a cell array), and arr is a structure array I want to assign to.
Matt J's solution in terms of vout works, but it still has the inefficiency of creating a cell array for something that Matlab should presumably be able to do efficiently.
If there is a better way to assign to all the elements of a structure array (especially a way to allow something like [arr.field]=0), please let me/us know. Thanks.
[arr.field]=deal(0)
requires no special code. However, striving for efficiency with structure and cell arrays is bound to be unfruitful. Structs and cells are inherently inefficient for storing large data, as compared to vectors and matrices, and you shouldn't really be using them in such situations. Memory access will be slow for one thing because they do not store data contiguously in RAM. If on the other hand, you don't have large data, efficiency isn't really beneficial.
Lachlan
on 24 Aug 2017
Thanks, Matt J. I hadn't noticed deal() could be used with a scalar.
I agree that matrices are far and away the most efficient where they can be used, but I was assuming that (memory inefficiency) < (memory inefficiency + interpreter inefficiency).
Accepted Answer
More Answers (0)
Categories
Find more on Data Type Identification in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!