2010-02-25 8 views
42

यहाँ का एक उदाहरण है कि मैं क्या तलाश कर रहा हूँ:MATLAB में मैं एकाधिक असाइनमेंट कैसे करूं?

>> x 

x = 

    88 

>> y 

y = 

    12 

लेकिन बजाय मैं की तरह त्रुटियों मिल:

??? Too many output arguments. 

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

मैं उम्मीद यह बाद में की तरह कुछ चाहते

मैंने सोचा deal() ऐसा कर सकता है, लेकिन ऐसा लगता है कि यह केवल कोशिकाओं पर काम करता है।

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

मैं मेरी समस्या कैसे हल करते हैं? यदि मैं अलग से उनसे निपटना चाहता हूं तो क्या मुझे लगातार 1 और 2 से अनुक्रमित करना चाहिए?

+3

डील पर केवल तभी कारगर साबित foo एक सेल है प्रदान करता है

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

सभी दस्तावेज़। आपने foo को मानक सरणी के रूप में परिभाषित किया है। यही कारण है कि आपको '??? गैर-सेल सरणी ऑब्जेक्ट से सेल सामग्री संदर्भ। त्रुटि संदेश। –

उत्तर

40

आप डॉन ' टी deal बिल्कुल (संपादित करें: Matlab 7.0 या बाद में) की आवश्यकता है और, आपके उदाहरण के लिए, आपको mat2cell की आवश्यकता नहीं है; आप कोई अन्य तर्कों ::

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

x = 

    88 


y = 

    12 

साथ num2cell उपयोग कर सकते हैं आप किसी अन्य कारण से deal का उपयोग करना चाहते हैं, तो आप कर सकते हैं:

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

x = 

    88 


y = 

    12 
+3

बस एक साइड नोट, मुझे लगता है कि आप केवल मैटलैब 7+ में सौदा (पहले उदाहरण में) का उपयोग न करने से दूर हो सकते हैं। –

+0

दिलचस्प। मुझे नहीं पता था कि आजकल सौदा अनावश्यक है। हालांकि, मैंने उद्देश्य पर mat2cell का उपयोग किया, क्योंकि मुझे लगता है कि ओपी एक दूसरे से कॉलम अलग करना चाहता है। – Jonas

+1

यह वास्तव में अच्छा है। लेकिन क्या यह सब एक लाइन पर रखने का कोई तरीका है? शायद कुछ ऐसा हो सकता है: '[x y] = num2cell (foo) {:} '(क्षमा करें, अभी भी मैटलैब द्वारा अक्सर उलझन में है।) –

1

DEAL वास्तव में उपयोगी है, और वास्तव में भ्रमित है। foo को एक सेल सरणी होने की जरूरत है, मुझे विश्वास है।

> foo = {88, 12} 
foo = 

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

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

क्या mtrw ने कहा: निम्नलिखित, सप्टक में काम करता है, तो मैं सही ढंग से याद है यह रूप में अच्छी तरह MATLAB में काम करेंगे करने लगता है। असल में, आप एक सेल सरणी के साथ सौदा का उपयोग करना चाहते हैं (हालांकि सौदा (88,12) भी काम करता है)।

मान लें कि आप एक सरणी foo n-दर-2 है कि के साथ शुरू, और आप एक्स के लिए प्रथम स्तंभ और 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 है। मतलब है कि आप सिंटैक्स का उपयोग 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

उदाहरण नहीं होगा '[ए 1, ए 2, ए 3, ए 4] = सूची (1: 4)' कारण 'बहुत अधिक आउटपुट तर्क' त्रुटि? – zhangxaochen

1

मैं अन्य उत्तर, इसलिए अलग अलावा टिप्पणी नहीं कर सकता।

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

deal गैर scalars के लिए एक एक लाइनर के रूप में, ज़ाहिर है, के रूप में अच्छी तरह से इस्तेमाल किया जा सकता है, तो आप पहले से ही उन्हें अलग चर में है कहते हैं:

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.fielddeal के बिना अन्य उत्तरों में उल्लेख किए जा सकते हैं।

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 
में जिसके परिणामस्वरूप की तलाश में हो सकता है

तो आपके पास एक काम करने वाला एक-लाइनर है।