2014-01-30 213 views
4

我在MATLAB中有一個主要由零組成的1x1033列向量 - 每隔一段時間,都有兩個數字相鄰,即兩邊都是零(即如果第一個數字是正數,第二個數字是負數,反之亦然)。我試圖在這兩個值之間輸入零而不在矩陣中的任何其他點添加零。我以爲我有它,但我的循環只在前兩個非零值之間添加一個零,而忽略其餘部分。使用循環在MATLAB中向現有矢量添加元素

任何幫助,將不勝感激。

我的代碼如下所示: 對於h = n:-1:1; zero_crossing_markers(h);

if zero_crossing_markers(h) > 0 && zero_crossing_markers(h+1) < 0; 
    %zero_values_added = [zero_crossing_markers(1:h), 0, zero_crossing_markers(h+1:n)]; 
    A = zero_crossing_markers(1:h); 
    B = 0; 
    C = zero_crossing_markers(h+1:n); 
    zero_values_added = [A, B, C]; 

    else if zero_crossing_markers(h) < 0 && zero_crossing_markers(h+1) > 0; 
     %zero_values_added = [zero_crossing_markers(1:h), 0, zero_crossing_markers(h+1:n)]; 
     A = zero_crossing_markers(1:h); 
     B = 0; 
     C = zero_crossing_markers(h+1:n); 
     zero_values_added = [A, B, C]; 

    else 
     zero_values_added(h) = 0; 
     end 
end 

回答

2

沒有循環需要。它可以在量化的方式來解決,在一個行:

clear result 
data = [1 -2 0 0 0 2 -3 0 0 5 -1 2 0 1 1]; %// example data 

result((1:numel(data)) + [0 cumsum(abs(diff(sign(data)))==2)]) = data; 

在這個例子中,

result = 
    Columns 1 through 15 
    1  0 -2  0  0  0  2  0 -3  0  0  5  0 -1  0 
    Columns 16 through 19 
    2  0  1  1 

這是如何工作的:這個想法是伸展dataresult使零點自動獲得插入。從abs(diff(sign(data)))==2獲得將發生拉伸的位置,並且其中將插入零,在該向量中的值指示下面的位置應該是插入的零。 cumsum用於累積所有拉伸。

+0

+1,那麼,或許應該注意其他的答案,而我自己寫。我喜歡你的更好,但我會保持我的,因爲它更容易理解(IMO)... –

1

該做的伎倆:

x = [0 1 -2 0 3 -4 0 0]'; 
y = zeros(size(x,1) + nnz(x>0),1); 
ix = find(x > 0); 
ix = ix + (0:numel(ix) - 1)' 
ix2 = ix + 2; 
y(ix) = x(x > 0); 
y(ix2) = x(x < 0); 
y = 
    0 
    1 
    0 
    -2 
    0 
    3 
    0 
    -4 
    0 
    0 
+0

+1當然,你的答案值得保留,是的,更容易遵循 –

+0

...但是,這如果你有一個負值,然後是正值,那麼它就不起作用。例如,'x = [0 -1 2]'不返回'[0 -1 0 2]' –