2011-05-27 15 views
21

बनाना वी आकार कीNX 1, मैं द्विआधारी सूचक मैट्रिक्स एम आकार कीNX मैक्स (वी) बनाने के लिए ऐसी है कि की पंक्ति प्रविष्टियों एम है चाहते हैं संबंधित कॉलम इंडेक्स में , अन्यथा।एक वेक्टर के लिए संकेतक मैट्रिक्स

उदाहरण के लिए: अगर वी

V = [ 3 
     2 
     1 
     4] 

है सूचक मैट्रिक्स

M= [ 0 0 1 0 
    0 1 0 0 
    1 0 0 0 
    0 0 0 1] 

उत्तर

28

इस तरह एक संकेतक मैट्रिक्स के बारे में बात है, यह बेहतर है अगर आप इसे विरल करना है होना चाहिए। आप लगभग हमेशा मैट्रिक्स को इसके साथ गुणा कर रहे होंगे, इसलिए इसे एक कुशलता से गुणा करें।

n = 4; 
V = [3;2;1;4]; 
M = sparse(V,1:n,1,n,n); 
M = 
    (3,1)  1 
    (2,2)  1 
    (1,3)  1 
    (4,4)  1 

आप एम एक पूर्ण मैट्रिक्स किया जा रहा है, तो यह बनाने पर जोर देते हैं यदि ऐसा है तो पूर्ण के उपयोग के द्वारा, इस तथ्य के बाद सरल है।

full(M) 
ans = 
    0  0  1  0 
    0  1  0  0 
    1  0  0  0 
    0  0  0  1 

स्पैर मैट्रिस का उपयोग कैसे करें सीखें। आप ऐसा करने से काफी लाभ प्राप्त करेंगे। माना जाता है कि, 4x4 मैट्रिक्स के लिए, स्पैस ज्यादा लाभ नहीं उठाएगा। लेकिन उदाहरण के मामले कभी आपकी असली समस्या नहीं हैं। मान लीजिए कि एन वास्तव में 2000 था?

n = 2000; 
V = randperm(n); 
M = sparse(V,1:n,1,n,n); 
FM = full(M); 

whos FM M 
    Name   Size     Bytes Class  Attributes 

    FM  2000x2000   32000000 double    
    M   2000x2000    48008 double sparse  

स्पैर मैट्रिस केवल स्मृति की शर्तों के मामले में ही प्राप्त नहीं होता है। एक मैट्रिक्स गुणा करने के लिए आवश्यक समय की तुलना करें।

A = magic(2000); 

tic,B = A*M;toc 
Elapsed time is 0.012803 seconds. 

tic,B = A*FM;toc 
Elapsed time is 0.560671 seconds. 
1

आप मेमोरी के लिए स्पैस होने के लिए इंडेक्स मैट्रिक्स बनाना चाहते हैं।

vSize = size(V); 
Index = sparse(vSize(1),max(V)); 
for i = 1:vSize(1) 
    Index(i, v(i)) = 1; 
end 

मैं इस अपने आप का उपयोग किया है, का आनंद लें :)

0
M=sparse(V,1:size(V,1),1)'; 

एक विरल मैट्रिक्स है कि आप एक पूर्ण संस्करण के रूप में गणना में उपयोग कर सकते हैं का उत्पादन करेगा: यह जितना आसान है। आप वास्तव में शून्य स्टोर करने के लिए पूर्ण (एम) "फुलाए" एम का उपयोग कर सकते हैं।

6

यह करने के लिए एक त्वरित तरीका है - अगर आप विरल मैट्रिक्स की आवश्यकता नहीं है - आकार कम से कम अधिकतम (v), तो अपने सूचक मैट्रिक्स वी से अनुक्रमित निकाल कर बनाने के लिए की, एक पहचान मैट्रिक्स बनाने के लिए है:

m = max(V); 
I = eye(m); 
V = I(V, :); 
+0

क्या आप कृपया अपने कोड की तीसरी पंक्ति समझा सकते हैं? – Tarun

1

यहाँ sparse लेकिन accumarray के साथ एक और दृष्टिकोण, समान है:

V = [3; 2; 1; 4]; 
M = accumarray([(1:numel(V)).' V], 1); 
1

आप बस एक linear index बनाने के लिए है, तो उपयोग करने वालेको भरने के लिए एक पंक्ति सूचकांक के साथ V में स्तंभ अनुक्रमणिका गठजोड़ कर सकते हैं(शून्य के लिए आरंभ किया गया):

M = zeros(numel(V), max(V)); 
M((1:numel(V))+(V.'-1).*numel(V)) = 1; 
संबंधित मुद्दे