2013-05-04 9 views
14

के साथ एक ब्लॉक विकर्ण मैट्रिक्स बनाएं मैं एक मैट्रिक्स कश्मीर के आयाम n x, n है। मैं एक नया ब्लॉक विकर्ण मैट्रिक्स एम आयाम एन एक्स एन, यह घ मैट्रिक्स कश्मीर इसके विकर्ण रूप में की ब्लॉक होती हैं, जैसे कि के बनाना चाहते हैं।MATLAB: एक ही दोहराए जाने वाले ब्लॉक

मैं सीधे इस्तेमाल किया है | एम = blkdiag (कश्मीर, कश्मीर, कश्मीर) आदि था छोटा रहा। दुर्भाग्यवश, डी बहुत बड़ा है और मैं डी के साथ मैन्युअल रूप से blkdiag() फ़ंक्शन के लिए समान तर्क लिखना नहीं चाहता हूं।

क्या ऐसा करने के लिए कोई छोटा, स्मार्ट तरीका है?

उत्तर

21

आप इसके लिए kron का उपयोग कर सकते हैं।

M = kron(X,Y) 

रिटर्न एक्स और वाई की क्रोनेकर टेन्सर उत्पाद परिणाम एक्स के तत्वों और Y तो एक्स के उन लोगों के बीच सभी संभव उत्पादों लेने के द्वारा गठित एक बड़े सरणी है एम-से-एन और वाई है पी-बाय-क्यू, फिर क्रोन (एक्स, वाई) एम * पी-बाय-एन * क्यू है। में तो इस तरह अपने मामले में कुछ कर देगा:

M = kron(eye(L),K) 

L साथ ब्लॉक के #।

+0

संकेत @natan के लिए धन्यवाद। मैंने कुछ संयोजनों की कोशिश की और पाया कि निम्नलिखित मुझे वह देता है जो मैं ढूंढ रहा हूं - 'एम = क्रोन (आंख (डी), के) ' – steadyfish

2

निम्नलिखित कार्य करना चाहिए:

डी = 5; K = आंख (3); टी = सेल (1, डी);

जे = 1: डी टी {जे} = के; अंत

एम = blkdiag (टी {:})

0
s = 'A,'; 
s = repmat(s,[1,n2]); 
s = ['B=blkdiag(', s(1:end-1),');']; 
eval(s); 

यह Kron आँख का उपयोग कर से अधिक तेजी से हो सकता है।

+0

बहुत एनबी !!!!!!!!! –

1
tmp = repmat({K},d,1); 
M = blkdiag(tmp{:}); 

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

0

एक "के लिए" लूप मदद कर सकता है। पसंद:

M = k; 
for i=1:N/n - 1 
    M=blkdiag(M,k); 
end 
संबंधित मुद्दे