代码之家  ›  专栏  ›  技术社区  ›  Benjamin Oakes

如何在MATLAB中进行多重赋值?

  •  43
  • Benjamin Oakes  · 技术社区  · 16 年前

    以下是我正在寻找的一个例子:

    >> foo = [88, 12];
    >> [x, y] = foo;
    

    我想要 期待 事后诸如此类:

    >> x
    
    x =
    
        88
    
    >> y
    
    y =
    
        12
    

    ??? Too many output arguments.
    

    我想 deal() 也许可以,但它似乎只对细胞起作用。

    >> [x, y] = deal(foo{:});
    ??? Cell contents reference from a non-cell array object.
    

    我如何解决我的问题?如果我想单独处理它们,我必须不断地索引1和2吗?

    9 回复  |  直到 16 年前
        1
  •  44
  •   Ramashalanka    16 年前

    你不需要 deal mat2cell num2cell 没有其他参数::

    foo = [88, 12];
    fooCell = num2cell(foo);
    [x y]=fooCell{:}
    
    x =
    
        88
    
    
    y =
    
        12
    

    如果你想用

    foo = [88, 12];
    fooCell = num2cell(foo);
    [x y]=deal(fooCell{:})
    
    x =
    
        88
    
    
    y =
    
        12
    
        2
  •  18
  •   Jonas Heidelberg liori    14 年前

    注意 deal

    > [x,y] = deal(88,12)
    x = 88
    
    y = 12
    

    语法 c{:} 转换列表中的单元格数组,列表是 comma separated values c{:} 语法作为其他函数的参数,而不是 . 要了解这一点,请尝试以下操作:

    > z = plus(1,2)
    z = 3
    
    > c = {1,2};
    > z = plus(c{:});
    z = 3
    
        3
  •  8
  •   Sander Evers    15 年前

    使用 num2cell 在一行中定义一个辅助函数 list :

    function varargout = list(x)
    % return matrix elements as separate output arguments
    % example: [a1,a2,a3,a4] = list(1:4)
    
    varargout = num2cell(x);
    
    end
    
        4
  •  4
  •   Community Mohan Dere    9 年前

    mtrw 说。基本上,您希望对单元格数组使用deal(尽管deal(88,12)也可以)。

    假设以n×2的数组foo开始,并希望将第一列指定给x,第二列指定给y,则执行以下操作:

    foo = [88,12;89,13;90,14];
    %# divide the columns of foo into separate cells, i.e. do mat2cell(foo,3,[1,1])
    fooCell = mat2cell(foo,size(foo,1),ones(size(foo,2),1));
    [x,y] = deal(fooCell{:});
    
        5
  •  1
  •   mtrw    16 年前

    DEAL 这真的很有用,也很让人困惑。 foo 我相信它本身就是一个细胞阵列。如果我没记错的话,以下内容似乎在八度音阶中也能工作:

    > foo = {88, 12}
    foo =
    
    {
      [1,1] =  88
      [1,2] =  12
    }
    
    > [x,y] = deal(foo{:})
    x =  88
    y =  12
    
        6
  •  1
  •   Community Mohan Dere    9 年前

    我无法评论其他答案,因此需要单独添加。

    you can use deal(88,12) if you are starting from scalars

    deal 也可以用作非标量的单行程序,当然,如果您已经在单独的变量中使用了它们,那么可以说:

    a = 123;
    b = rand(3);
    c = {a, b};
    d = struct('field','val')
    

    >> [x,y,z,w] = deal(a,b,c,d)
    x =
       123
    y =
        0.6370    0.2165    0.6711
        0.2945    0.8803    0.2705
        0.7633    0.1537    0.0767
    z = 
        [123]    [3x3 double]
    w = 
        field: 'val'
    

    但是,如果它们打包在一个变量中,则只能 处理 如果它们位于单元格或结构数组中,则使用 deal(X{:}) 用于单元阵列和 deal(S.field) X{:} 和 S.field 处理

        7
  •  1
  •   Tigliottu    10 年前

    为方便起见,创建函数arr2vars

    function varargout = arr2vars(arr)
    % Distribute elements over variables
    
    N = numel(arr);
    if nargout ~= N
        error('Number of outputs does not match number of elements')
    end
    for k = 1:N
        varargout{k} = arr(k);
    end
    

    你可以这样使用它

    [~,roi] = imcrop(im);
    [x,w,y,h] = arr2vars(roi);
    
        8
  •  0
  •   luckydonald    10 年前

    >>> foo = [88, 12];
    >>> [x, y] = deal(foo(1), foo(2))
    

    x = 
        88
    
    y = 
        12
    

    所以你有一个工作的一班轮。

        9
  •  -1
  •   0x1000001    10 年前

    x = foo (1, 1)  
    y = foo (1, 2)
    

    提供

    >> x
    
    x =
    
    88
    
    >> y
    
    y =
    
    12
    

    完整文档位于 Mathworks.