2015-11-15 212 views
6

我想刪除下列矩陣的對角線;Matlab:從矩陣中刪除對角線並改寫

[0 1 1 
    0 0 0 
    0 1 0] 

,並把它放進一個向量作爲這樣

[1 1 0 0 0 1] 

有一個單向函數來做到這一點? 我在堆棧溢出中找到的大多數其他解決方案都會刪除全零。

+0

它總是會是一個矩形矩陣或可以維度不同嗎? –

回答

7

如果兩條線都很好...

x = x.'; %'// transpose because you want to work along 2nd dimension first 
result = x(~eye(size(x))).'; %'// index with logical mask to remove diagonal 
+0

就這麼簡單! 非常感謝! – Jill

+0

爲什麼轉位?我可以通過測試看到它的工作原理,但是我可以看到,「〜eye」在原始的「x」上形成了一個掩碼。第二行代碼是否按列主要順序使用線性索引? – Adriaan

+2

第一次轉置是因爲OP想要返回行主要結果,但是用'〜eye(size(x))'索引返回列主要。第二次轉置是因爲OP想要一個行向量而不是由邏輯掩碼返回的列向量。 – IKavanagh

1

這裏是一個幾乎有襯墊 -

[m,n] = size(x); 
x(setdiff(reshape(reshape(1:numel(x),m,n).',1,[]),1:m+1:numel(x),'stable')) 

而且我會把我的最愛bsxfun這裏 -

xt = x.'; %//' 
[m,n] = size(x); 
out = xt(bsxfun(@ne,(1:n)',1:m)).' 

樣品運行 -

>> x 
x = 
    52 62 37 88 
    23 68 98 91 
    49 40  4 79 
>> [m,n] = size(x); 
>> x(setdiff(reshape(reshape(1:numel(x),m,n).',1,[]),1:m+1:numel(x),'stable')) 
ans = 
    62 37 88 23 98 91 49 40 79 
>> xt = x.'; 
>> xt(bsxfun(@ne,(1:n)',1:m)).' 
ans = 
    62 37 88 23 98 91 49 40 79