Assign Multiple Variables

636 Ansichten (letzte 30 Tage)
Zach
Zach am 28 Sep. 2011
Kommentiert: Walter Roberson am 15 Apr. 2023
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 Kommentar
Image Analyst
Image Analyst am 29 Sep. 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.

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 28 Sep. 2011
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 Kommentare
Fangjun Jiang
Fangjun Jiang am 14 Apr. 2023
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
Walter Roberson
Walter Roberson am 15 Apr. 2023
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

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (4)

Raziman Thottungal Valapu
Raziman Thottungal Valapu am 1 Okt. 2020
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 Kommentar
Stephen23
Stephen23 am 1 Okt. 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.

Melden Sie sich an, um zu kommentieren.


Jeff Miller
Jeff Miller am 15 Aug. 2018
matsplit does this.
  2 Kommentare
Stephen23
Stephen23 am 15 Aug. 2018
+1 neat
Brent F
Brent F am 19 Jun. 2021
Much cleaner than deal(a(1), a(2), a(3), a(4), ...)

Melden Sie sich an, um zu kommentieren.


Viktor
Viktor am 1 Sep. 2018
Bearbeitet: Viktor am 1 Sep. 2018
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 Kommentare
Daniel Birch
Daniel Birch am 12 Sep. 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 am 12 Sep. 2018
Bearbeitet: Stephen23 am 12 Sep. 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

Melden Sie sich an, um zu kommentieren.


Dan Erwin
Dan Erwin am 14 Apr. 2023
Bearbeitet: Walter Roberson am 14 Apr. 2023
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 Kommentare
Fangjun Jiang
Fangjun Jiang am 14 Apr. 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 am 15 Apr. 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.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by