Generate a comma-separated list from a numeric array?
Mostrar comentarios más antiguos
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 comentarios
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
el 20 de Mzo. de 2013
Matt J
el 21 de Mzo. de 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
el 24 de Ag. de 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).
Respuesta aceptada
Más respuestas (0)
Categorías
Más información sobre Data Type Identification en Centro de ayuda y File Exchange.
Productos
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!