Octave / MATLAB中的deal()函数有什么意义?

时间:2014-06-13 16:09:08

标签: matlab octave

一些参考代码使用函数deal(),如

[a, b, c] = deal (1,2,3)

如文档(for Octavefor 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的元素

或者也许只是因为我过度思考这个功能的微不足道的使用。

2 个答案:

答案 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-writehttp://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