2010-02-25 41 views
42

這裏有一個例子就是我在尋找:如何在MATLAB中進行多項賦值?

>> 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嗎?

+3

新政僅適用如果foo是一個細胞。您已將foo定義爲標準數組。這就是爲什麼你有'???來自非單元格數組對象的單元格內容引用。「錯誤消息。 – 2010-02-25 20:17:47

回答

40

你不」根本不需要deal(編輯:對於Matlab 7.0或更高版本),對於您的示例,您不需要mat2cell;您可以使用num2cell沒有其他參數::

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

x = 

    88 


y = 

    12 

如果你想使用deal其他一些原因,你可以:

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

x = 

    88 


y = 

    12 
+3

只是一個側面說明,我認爲你只能在Matlab 7+中不使用交易(如第一個例子)。 – 2010-02-25 20:59:10

+0

有趣。我不知道現在交易是不必要的。 但是,我故意使用了mat2cell,因爲我認爲OP可能希望將列彼此分開。 – Jonas 2010-02-25 21:07:12

+1

這真的很好。但是有什麼辦法可以把它全部放在一條線上?可能是這樣:'[x y] = num2cell(foo){:}'(對不起,仍然被Matlab混淆了) – 2010-02-25 21:34:13

1

DEAL真的很有用,而且很混亂。 foo需要是一個單元陣列本身,我相信。下面似乎倍頻工作,如果我沒有記錯,將在MATLAB工作,以及:

> foo = {88, 12} 
foo = 

{ 
    [1,1] = 88 
    [1,2] = 12 
} 

> [x,y] = deal(foo{:}) 
x = 88 
y = 12 
4

什麼mtrw說。基本上,你想使用處理單元格數組(儘管deal(88,12)也適用)。

假設你開始使用數組FOO是n乘2,你要分配的首列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{:}); 
11

注意deal接受「名單」的說法,不一個單元陣列。因此,預期以下工作:

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

y = 12 

語法c{:}轉換列表中的一個單元陣列,以及一個列表是一個comma separated values,像函數參數。這意味着您可以使用c{:}語法作爲除deal之外的其他函數的參數。一看就知道,請嘗試以下操作:

> z = plus(1,2) 
z = 3 

> c = {1,2}; 
> z = plus(c{:}); 
z = 3 
7

要在一行中使用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 
+0

會不會''a1,a2,a3,a4] = list(1:4)'原因'輸出參數太多錯誤? – zhangxaochen 2015-04-06 12:16:27

1

我不能評論其他的答案,所以單獨加入。

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中(如果它們位於單元格或結構數組中) - 對於單元陣列,則爲deal(X{:}),對於結構數組則爲deal(S.field)。 (在後一種情況下,只有一個字段被處理,但是來自陣列中的所有結構)。使用Matlab v.7 +,您可以使用X{:}S.field而不是deal,如其他答案中所述。

0

創建方便的功能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); 
1

你可能會尋找

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

導致

x = 
    88 

y = 
    12 

所以你有一個工作一班。

1

有一個更簡單的方法。

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

提供

>> x 

x = 

88 

>> y 

y = 

12 

完整的文檔在Mathworks.