2015-11-15 11 views
6

मैं निम्नलिखित मैट्रिक्स के विकर्ण को हटाना चाहता हूं;Matlab: मैट्रिक्स से विकर्ण निकालें और सुधार

[0 1 1 
    0 0 0 
    0 1 0] 

और इस तरह के

[1 1 0 0 0 1] 

वहाँ यह करने के लिए एक-तरफ़ा समारोह है के रूप में एक सदिश में रखते? स्टैक ओवरफ़्लो पर पाए गए अधिकांश अन्य समाधान सभी शून्य हटाते हैं।

+0

क्या यह हमेशा एक वर्ग मैट्रिक्स होने जा रहा है या आयाम भिन्न हो सकते हैं? –

उत्तर

7

दो पंक्तियों ठीक हैं ...

x = x.'; %'// transpose because you want to work along 2nd dimension first 
result = x(~eye(size(x))).'; %'// index with logical mask to remove diagonal 
+0

यह उतना आसान है जितना! बहुत बहुत धन्यवाद! – Jill

+0

ट्रांसपोज़ क्यों करें? मैं देख सकता हूं कि यह परीक्षण द्वारा काम करता है, लेकिन '~ आंख' मूल 'x' पर मुखौटा बनाता है जहां तक ​​मैं देख सकता हूं। कोड की दूसरी पंक्ति स्तंभ-प्रमुख क्रम में रैखिक सूचकांक का उपयोग करती है? – Adriaan

+2

पहला ट्रांज़ेक्शन इसलिए है क्योंकि ओपी चाहता है कि परिणाम पंक्ति प्रमुख लौटाए लेकिन '~ आंख (आकार (एक्स)) के साथ अनुक्रमण 'रिटर्न कॉलम प्रमुख। दूसरा ट्रांज़ेक्शन इसलिए है क्योंकि ओपी लॉजिकल मास्क द्वारा लौटाए गए कॉलम वेक्टर की बजाय एक पंक्ति वेक्टर चाहता है। – IKavanagh

1

यहाँ एक लगभग एक लाइनर है -

[m,n] = size(x); 
x(setdiff(reshape(reshape(1:numel(x),m,n).',1,[]),1:m+1:numel(x),'stable')) 

और मैं अपने fav यहाँbsxfun डाल देंगे -

xt = x.'; %//' 
[m,n] = size(x); 
out = xt(bsxfun(@ne,(1:n)',1:m)).' 

नमूना रन -

>> x 
x = 
    52 62 37 88 
    23 68 98 91 
    49 40  4 79 
>> [m,n] = size(x); 
>> x(setdiff(reshape(reshape(1:numel(x),m,n).',1,[]),1:m+1:numel(x),'stable')) 
ans = 
    62 37 88 23 98 91 49 40 79 
>> xt = x.'; 
>> xt(bsxfun(@ne,(1:n)',1:m)).' 
ans = 
    62 37 88 23 98 91 49 40 79 
संबंधित मुद्दे