一些参考代码使用函数deal()
,如
[a, b, c] = deal (1,2,3)
如文档(for Octave和for MATLAB)中所述,该函数只是将输入复制到输出。 为什么在这种情况下使用deal()
,甚至一般情况下?我正在尝试学习“更正确”的MATLAB / Octave用法,并想知道我是否遗漏了一些重要内容。也许,这是用法......
a=1, b=2, c=3
或更神秘的列表 - 解包像[a,b,c] = {1,2,3}{:}
这样的单元格数组,但比Python argument unpacking更受限制,就像在this question?deal()
与复杂/变量参数一起使用?我也理解单个参数[a,b,c]=deal(42)
,但这基本上是a=b=c=42
,而[a,b,c]=deal(x)
将x
分配给所有人,而不是每个x
的元素
或者也许只是因为我过度思考这个功能的微不足道的使用。
答案 0 :(得分:5)
我偶尔使用deal
的一个非常有用的方法是创建返回多个输出参数的匿名函数。例如,
>> f = @(x) deal(x^2,x^3);
>> [a,b] = f(3)
a =
9
b =
27
编辑,因为人们似乎发现此模式可能有用,请注意一个怪癖,因为您必须返回完整数量的输出。特别是,您不能使用a = f(3)
,否则会出错。要仅检索单个输出,请使用[a,~] = f(3)
或[~,b] = f(3)
。用于抑制输出参数的~
语法已经存在,因为大约R2007a左右(我恐怕我不记得确切的时间) - 在旧版本中,您将需要始终返回两个输出。希望这对你有用。
答案 1 :(得分:3)
首先,您的命名示例使用八度音程,但不能使用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,您可以轻松地将输出分配到“一行”中的sevaral变量。
如果一个函数的错误多于1,那就很有趣了
>> [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使用写入副本 - 请参阅https://en.wikipedia.org/wiki/Copy-on-write和http://www.matlabtips.com/copy-on-write/
并且 - afaik - octave:
octave:1> memory
Memory used by Octave: 24.4414 MB
Physical Memory (RAM): 7586.74 MB
octave:2> tic, m=rand(10000,10000); toc
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; toc
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