2015-05-26 62 views
-1

鑑於矩陣A = magic(5)你:以矩陣和檢索兩個對角線保持原有矩陣的尺寸在MATLAB

A = 17 24  1  8 15 
    23  5  7 14 16 
    4  6 13 20 22 
    10 12 19 21  3 
    11 18 25  2  9 

我想用命令如rot90diagtriutril和矩陣sum得到矩陣:

A = 17 0  0  0  15 
    0  5  0  14 0 
    0  0  13 0  0 
    0  12 0  21 0 
    11 0  0  0  9 

請,如果你不能想辦法來解決這個不用我寫的命令,這是確定做你自己的方式。

+0

只是一個提示:只要你有代碼,寫/從編輯器複製,後來選擇所有的它並點擊括號(又名代碼塊),所以它很好地呈現 – brodoll

+1

只是改變了標題,並按照你的建議。 –

回答

1

您可以簡單地使用linear indexing訪問對角線:

n = size(A,1); 
B = zeros(n); 
B(1:(n+1):end) = A(1:(n+1):end); %// main diagonal 
B(n:(n-1):(end-n+1)) = A(n:(n-1):(end-n+1)) 

,你會得到

B = 
17  0  0  0 15 
0  5  0 14  0 
0  0 13  0  0 
0 12  0 21  0 
11  0  0  0  9 
2

可以使用eye函數索引

>> A(~eye(size(A)) & ~flipud(eye(size(A))))=0 
A = 
    17  0  0  0 15 
    0  5  0 14  0 
    0  0 13  0  0 
    0 12  0 21  0 
    11  0  0  0  9 
0

另一種方法是:

mDiag = diag(diag(A)); 
aDiag = rot90(diag(diag(rot90(A))))'; 
overlap = A.*((diag(diag(A)) ~= 0) & (rot90(diag(diag(rot90(A)))) ~= 0)); 

solution = mDiag + aDiag - overlap 

而且比:

solution = 
17  0  0  0 15 
0  5  0 14  0 
0  0 13  0  0 
0 12  0 21  0 
11  0  0  0  9 
0

使用bsxfun

out = A.*bsxfun(@(x,y) x == y | x+y == size(A,1)+1,(1:size(A,1)).',1:size(A,1)) %//'