首先,你所提供的示例在Octave中可以工作,但不能在Matlab中使用!
octave:1> a=b=c=42
a = 42
octave:2> [a,b,c] = {1,2,3}{:}
a = 1
b = 2
c = 3
>> a=b=c=42
a=b=c=42
|
Error: The expression to the left of the equals sign is not a valid target for an assignment.
>> [a,b,c] = {1,2,3}{:}
[a,b,c] = {1,2,3}{:}
|
Error: Unbalanced or unexpected parenthesis or bracket.
如何以及何时使用
deal()
无法概括。这取决于您的脚本、数据结构、您想要做什么以及结果应该如何等因素。
>> m=rand(3,3);
>> [a,b,c]=m;
Too many output arguments.
>> [a,b,c]=reshape(m,[],1);
Error using reshape
Too many output arguments.
>> [a,b,c]=deal(reshape(m,[],1));
>>
因此,一些函数的设计中nargout = 1,您可以轻松地将输出分发到“一行”中的多个变量中。
如果一个函数有多个nargouts,那就有趣了。
>> [x,y,z]=qr(m)
x =
-0.7004 0.6471 -0.3012
-0.1144 -0.5183 -0.8475
-0.7045 -0.5592 0.4370
y =
-1.3776 -0.7928 -1.2897
0 -0.6388 -0.0796
0 0 -0.3499
z =
1 0 0
0 0 1
0 1 0
>> [x,y,z]=deal(qr(m))
x =
-1.3776 -1.2897 -0.7928
0.0673 -0.3588 -0.1418
0.4143 -0.1886 0.6229
y =
-1.3776 -1.2897 -0.7928
0.0673 -0.3588 -0.1418
0.4143 -0.1886 0.6229
z =
-1.3776 -1.2897 -0.7928
0.0673 -0.3588 -0.1418
0.4143 -0.1886 0.6229
>>
然而,在Matlab中复制变量
(例如为了更好地进行概述)并不像在其他语言中那样糟糕
(涉及内存浪费)。Matlab使用写时复制 - 参见
https://en.wikipedia.org/wiki/Copy-on-write 和
http://www.matlabtips.com/copy-on-write/。而且据我所知,Octave也是如此:
octave:1> memory
Memory used by Octave: 24.4414 MB
Physical Memory (RAM): 7586.74 MB
octave:2> tic, m=rand(10000,10000)
Elapsed time is 5.52749 seconds.
octave:3> memory
Memory used by Octave: 787.531 MB
Physical Memory (RAM): 7586.74 MB
octave:4> tic, n=m
Elapsed time is 4.19617e-05 seconds.
octave:5> memory
Memory used by Octave: 787.535 MB
Physical Memory (RAM): 7586.74 MB
octave:6> whos
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
m 10000x10000 800000000 double
n 10000x10000 800000000 double
Total is 200000000 elements using 1600000000 bytes
deal()
的唯一原因就是为了可读性。你提出的“深拷贝”和“浅拷贝”的问题在这里是无关紧要的(至少在Octave中),因为解释器足够聪明,能够检测到a = b
需要实际上在内存中进行复制。 - juliohm