2010-10-24 221 views
2

假設我有一個向量a = [1 2 4]。我希望它被轉換成看起來像這樣的載體b = [1 2 0 4],即每個數字被放置在正確的位置,並且因爲3沒有被包括在載體a中,所以它被載體b中的0代替。這可以通過以下方式完成:在MATLAB中轉換矩陣

a = [1 2 4] 
b = zeros(1, size(a, 2)); 
b(1, a) = a; 

我找不出一種方法來爲矩陣做同樣的事情。例如,

c = [1 4 2 0; 3 1 0 0; 4 0 0 0; 1 3 4 0]; 

我需要轉換成一個矩陣,看起來像這樣:

d = [1 2 0 4; 1 0 3 0; 0 0 0 4; 1 0 3 4]; 

任何提示嗎?如何才能做到這一點?我怎樣才能做到這一點,而不使用循環?

+0

如何做B =零(1,尺寸(A,2)); a(1,b)= b;實現你所問的變化? – 2010-10-24 18:06:04

+0

對不起,我的錯。以上更正。 – Eduardas 2010-10-24 18:20:47

回答

2

這裏的一個矢量化溶液:

a = [1 4 2 0; 3 1 0 0; 4 0 0 0; 1 3 4 0]; 
b = zeros(size(a,1),max(a(:))); 
[rowIdx,~] = find(a); 
vals = a(a>0); 
b(sub2ind(size(b),rowIdx,vals)) = vals; 
+0

謝謝!這看起來很棒! – Eduardas 2010-10-24 20:48:52

1

這是行不通的? (編輯:固定的錯誤。)

[m,n] = size(c) 
d = zeros(m,n) 
for i=1:m 
    d(i,c(i,c(i,:)>0)) = c(i,c(i,:)>0) 
end 
+0

沒有使用循環的方法嗎?我正在處理非常大的數據集和循環往往是非常緩慢的... – Eduardas 2010-10-24 18:33:21

+0

我認爲這是可能的,但在這種情況下,你正在對每一行進行相同的操作,所以它會循環遍歷每一行。即使對於大型矩陣,我也不認爲循環會使程序過於緩慢。 – 2010-10-24 18:38:53

+0

你介意分享非外觀溶劑嗎? – Eduardas 2010-10-24 19:24:19