2015-11-01 22 views
6

Tôi muốn tạo ra một ma trận mà giữa đường chéo là đối xứng giảm xuống hai bên, như thế này:Matlab giảm ma trận đường chéo

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 

Ma trận phải là 100x100 và các giá trị giữa 01. Cho đến bây giờ tôi chỉ nhận được các cạnh và đường chéo giữa, nhưng không thể có được ý tưởng về cách tự động điền phần còn lại.

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; 

Trả lời

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 

Bí quyết ở đây là sử dụng biến lập chỉ mục, ii, như một bộ đếm đồng thời giảm nhân, N-ii, giảm chiều dài của v, v(1:end-ii) và tăng bù đắp của đường chéo trong diag, ii hoặc -ii.

Chỉ cần để xác minh âm mưu kết quả sử dụng imagesc(D):

![enter image description here

7

Để tìm kiếm một giải pháp vectorized xem xét sử dụng spdiags().

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

này sẽ trở lại:

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 

Như @Adriaan chỉ ra B = B/n sẽ làm thay đổi các giá trị ma trận giữa 0 và 1.

5

Làm thế nào về một số code-golfing -

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

Đối trường hợp thực tế của bạn, vì bạn cần phải có giá trị trong phạm vi [0,1], bạn có thể mở rộng out, như vậy -

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

mẫu chạy -

>> 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

Tôi ngạc nhiên không ai đã đề nghị các ma trận toeplitz cho bạn:

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

Chúng tôi nhận được:

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 

Nếu bạn muốn bình thường hóa này để [0,1], chỉ cần làm việc bình thường tiêu chuẩn như rằng:

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

... và như vậy:

>> 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 
Các vấn đề liên quan