Assign Multiple Variables

I have a array for example [1,2,3,4]. I want to assign a variable to each number in the array such that a=1, b=2, c=3, and d=4. I know I can do each one separately but I want to know if it is possible to this in one line.

1 comentario

Image Analyst
Image Analyst el 29 de Sept. de 2011
Kind of reminded me of the FAQ: http://matlab.wikia.com/wiki/FAQ#How_can_I_create_variables_A1.2C_A2.2C....2CA10_in_a_loop.3F though I'm not saying you don't have a valid reason for doing that - you may well have.

Iniciar sesión para comentar.

 Respuesta aceptada

Walter Roberson
Walter Roberson el 28 de Sept. de 2011

13 votos

It is not possible in one statement. It is possible in two statements, which you could combine on one line.
t = num2cell([1,2,3,4]);
[a,b,c,d] = deal(t{:});

8 comentarios

Fangjun Jiang
Fangjun Jiang el 29 de Sept. de 2011
Or could work without deal. [a,b,c,d] = t{:}
Walter Roberson
Walter Roberson el 29 de Sept. de 2011
I don't believe I've see that documented. Based upon the descriptions of what {:} does, it would be reasonable to interpret it as equivalent to
[a,b,c,d] = t{1}, t{2}, t{3}, t{4}
which would be an invalid assignment (not enough output arguments) followed by three implicit disp()
Fangjun Jiang
Fangjun Jiang el 29 de Sept. de 2011
It is documented. See Example 3 at the bottom of this page.
http://www.mathworks.com/help/techdoc/ref/deal.html
Teja Muppirala
Teja Muppirala el 29 de Sept. de 2011
Editada: Walter Roberson el 15 de Abr. de 2023
You COULD do it in one statement, but, you probably wouldn't want to...
X = [10 20 30 40];
[a,b,c,d] = subsref(num2cell(X),struct('type',{'{}'},'subs',{{1:4}}))
Edwin Fonkwe
Edwin Fonkwe el 1 de En. de 2018
Hi Teja, I'm sorry if I sound rude, but this is a terrible implementation on Matlab!
Daniel Bridges
Daniel Bridges el 25 de En. de 2018
Edwin, have you seen Mathematica? From the introductory documentation I've read, it seems Wolfram wants users to code like that from the beginning ...
t = num2cell([1,2,3,4]);
[a,b,c,d] = deal(t{:})
a = 1
b = 2
c = 3
d = 4
[a,b,c,d] = t{:}
a = 1
b = 2
c = 3
d = 4
Back in 2011 it was not possible in one statement, at least not without an inline subsref(). A few years ago, however, a hack became available:
[a,b,c,d] = struct('x', num2cell([1,2,3,4])).x
a = 1
b = 2
c = 3
d = 4

Iniciar sesión para comentar.

Más respuestas (4)

Raziman Thottungal Valapu
Raziman Thottungal Valapu el 1 de Oct. de 2020

7 votos

It is now possible to do this in one line cleanly
[a,b,c] = deal(1, "test", [1:5])
Gives me
a =
1
b =
"test"
c =
1 2 3 4 5
As expected

1 comentario

Stephen23
Stephen23 el 1 de Oct. de 2020
@Raziman Thottungal Valapu: no, that is not what the question is about. The question specifies that there is only one input array, but your code uses multiple separate inputs to deal. Not the same thing at all.

Iniciar sesión para comentar.

Viktor
Viktor el 1 de Sept. de 2018
Editada: Viktor el 1 de Sept. de 2018

4 votos

The one-liner I have been using is the following:
[a,b,c,d] = feval(@(x) x{:}, num2cell([1,2,3,4]));
(Don't claim it is my original idea, just felt it belongs to this thread. If it is posted elsewhere feel free to link it.)

2 comentarios

Daniel Birch
Daniel Birch el 12 de Sept. de 2018
Additionally, you can replace num2cell with any cell array of the right size, even one containing multiple data types. For example,
[a,b,c,d] = feval(@(x) x{:}, {rand(2), 5, 'hello', pi});
a
a =
0.9502 0.4387
0.0344 0.3816
b
b =
5
c
c =
hello
d
d =
3.1416
Stephen23
Stephen23 el 12 de Sept. de 2018
Editada: Stephen23 el 12 de Sept. de 2018
That is just subsref wrapped up in an anonymous function, which is then called by feval.
Here it is with subsref called directly:
>> [a,b,c,d] = subsref({rand(2), 5, 'hello', pi}, substruct('{}',{':'}))
a =
0.103676 0.814128
0.208758 0.092132
b = 5
c = hello
d = 3.1416

Iniciar sesión para comentar.

Jeff Miller
Jeff Miller el 15 de Ag. de 2018

3 votos

matsplit does this.

2 comentarios

Stephen23
Stephen23 el 15 de Ag. de 2018
+1 neat
Brent F
Brent F el 19 de Jun. de 2021
Much cleaner than deal(a(1), a(2), a(3), a(4), ...)

Iniciar sesión para comentar.

Dan Erwin
Dan Erwin el 14 de Abr. de 2023
Editada: Walter Roberson el 14 de Abr. de 2023

0 votos

The thing we are trying to do is emulate the very useful Python idiom e.g.
a,b,c,d = [1,2,3,4]
In Matlab, if you create a function assignList.m as follows:
function varargout = assignList( inputArray )
for i = 1:length( inputArray)
varargout{i} = inputArray(i);
end
end
then you can do for example
[a,b,c,d] = assignList( [1,2,3,4] )

4 comentarios

Fangjun Jiang
Fangjun Jiang el 14 de Abr. de 2023
deal or no deal in MATLAB can do this already.
Stephen23
Stephen23 el 14 de Abr. de 2023
Editada: Stephen23 el 14 de Abr. de 2023
@Fangjun Jiang: how? Please show how DEAL can be used with one vector/array input as shown.
Fangjun Jiang
Fangjun Jiang el 14 de Abr. de 2023
@Stephen23, not with array input directly. See my comments at the answer by @Walter Roberson. My point is that this funciton is uncessary. Plus, I can't resist the "Deal or No deal" pun, now that I realized it.
Dan Erwin
Dan Erwin el 15 de Abr. de 2023
I would not have written my post if I had noticed the earlier answer which recommended the contributed function matsplit, which is similar to mine but is more flexible when using multidimensional arrays.

Iniciar sesión para comentar.

Categorías

Más información sobre Creating and Concatenating Matrices en Centro de ayuda y File Exchange.

Preguntada:

el 28 de Sept. de 2011

Comentada:

el 15 de Abr. de 2023

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by