2015-11-01 10 views
6

मैं इस तरह, एक मैट्रिक्स जहां मध्य विकर्ण संतुलित पक्षों के लिए कम हो रही है बनाना चाहते हैं:मैटलैब घटते मैट्रिक्स विकर्ण

5 4 3 2 1 
4 5 4 3 2 
3 4 5 4 3 
2 3 4 5 4 
1 2 3 4 5 

मैट्रिक्स 100x100 हो गया है और मूल्यों 0 और 1 के बीच हैं। अब तक मुझे केवल किनारों और मध्य विकर्ण मिलते हैं, लेकिन यह विचार नहीं मिल सकता कि बाकी को स्वचालित रूप से कैसे भरें।

v = ones(1,100); 
green = diag(v); 
green(:,1) = fliplr(0:1/99:1); 
green(1,:) = fliplr(0:1/99:1); 
green(100,:) = 0:1/99:1; 
green(:,100) = 0:1/99:1; 

उत्तर

4
N = 100; %// size of your matrix 
v = ones(1,N); %// get a vector of ones 
D = N*diag(v); %// set the main diagonal 
for ii = 1:size(D,1)-1 
    tmp = (N-ii)*diag(v(1:end-ii),ii); %//positive direction off- 
    tmp2 = (N-ii)*diag(v(1:end-ii),-ii); %//negative direction off-diagonal 
    D = D+tmp+tmp2; %// Add them up 
end 
D = D/N; %// scale values to between 0 and 1 

चाल यहाँ,, अनुक्रमण चर, ii उपयोग करने के लिए एक काउंटर के रूप में एक साथ गुणा, N-ii कम करने के लिए v, v(1:end-ii) की लंबाई कम होती है और वृद्धि diag भीतर विकर्ण की भरपाई है, ii या -ii

बस imagesc(D) का उपयोग कर साजिश सत्यापित करने के लिए परिणाम:

![enter image description here

7

एक vectorized समाधान के लिए देखने के लिए spdiags() उपयोग करने पर विचार।

n = 5; 
A = repmat([1:n-1,n:-1:1],n,1); 
B = full(spdiags(A,-n+1:n-1,n,n)); 

यह वापस आ जाएगी:

5 4 3 2 1 
4 5 4 3 2 
3 4 5 4 3 
2 3 4 5 4 
1 2 3 4 5 

रूप @Adriaan ने बताया B = B/n 0 और 1.

5

के बीच मैट्रिक्स मूल्यों को बदलने होगा कैसे कुछ code-golfing के बारे में -

n = 5 
M = mod(bsxfun(@plus,n:-1:1,(0:n-1)'),n) 
out = triu(M)+tril(n-M) 

लिए

आपका वास्तविक मामला, क्योंकि आपको होना चाहिए रेंज [0,1] में मूल्यों, आप out पैमाने पर कर सकते हैं, तो जैसे -

out = (out - 1)/max(out(:)-1) 

नमूना रन -

>> n = 5; 
M = mod(bsxfun(@plus,n:-1:1,(0:n-1)'),n); 
out = triu(M)+tril(n-M); 
>> out 
out = 
    5  4  3  2  1 
    4  5  4  3  2 
    3  4  5  4  3 
    2  3  4  5  4 
    1  2  3  4  5 
>> out = (out - 1)/max(out(:)-1) 
out = 
      1   0.75   0.5   0.25   0 
     0.75   1   0.75   0.5   0.25 
      0.5   0.75   1   0.75   0.5 
     0.25   0.5   0.75   1   0.75 
      0   0.25   0.5   0.75   1 
6

मैं हैरान हूँ कि कोई भी आप के लिए toeplitz मैट्रिक्स की सिफारिश की है:

n = 5; 
out = toeplitz(n:-1:1); 

हमें मिलता है:

out = 


    5  4  3  2  1 
    4  5  4  3  2 
    3  4  5  4  3 
    2  3  4  5  4 
    1  2  3  4  5 

आप [0,1] को यह सामान्य बनाने चाहते हैं, बस मानक सामान्य करना ऐसा है कि:

out_new = (out - 1)/(n - 1) 

... और इसलिए:

>> out = (out - 1)/(n - 1) 

out = 

    1.0000 0.7500 0.5000 0.2500   0 
    0.7500 1.0000 0.7500 0.5000 0.2500 
    0.5000 0.7500 1.0000 0.7500 0.5000 
    0.2500 0.5000 0.7500 1.0000 0.7500 
     0 0.2500 0.5000 0.7500 1.0000 
संबंधित मुद्दे