2015-04-23 28 views
0

原始的問題

所以,如果我有一個數組,S:替換值在磁盤陣列和前值Matlab的

s= [4 5 2 5 8 4 11 6] 

我怎麼會去更換任何數量大於6等於先前的數。給予s到是:

s=[4 5 2 5 5 4 4 6] 

更新問題

我想檢查的數量至少增加一倍對上號,如果是與以前的更換次數。使用不同的例子以上,S:

s= [8 9 3 6 7 2 5] 

將被替換,S:

s= [8 9 3 3 3 2 2] 
+3

你期待'S = [5,7,9]'什麼輸出,可能是'[5,5,7]'或'[5,5,5]'或者不可能有數字序列> 6?你有沒有試過用for循環解決這個問題? – Daniel

+0

對於s = [5,7,9]它應該給[5,5,5] – MRaff16

+0

@丹尼爾好抓! –

回答

0

所有你需要做的是,重複你的陣列超過所有的值,並檢查當前值大於前一次值的兩倍(如果這是你所需要的,你可以用> =(大於或等於)替換>)並且只要你滿足所需的條件,你只需要從s(i-1 )即先前索引s(i)即當前位置。

您r循環從i = 2開始而不是1,因爲在i = 1的情況下沒有先前的值來檢查。在大多數語言中,MALTAB索引從i開始而不是0。

s = [4 2 7 5 1]; 

for i=2:numel(s) 
    if s(i) > 2*s(i-1) 
     s(i) = s(i-1); 
    end 
end 
+0

對於s = [5,7,9]'這段代碼返回'[5,5,7]'。把它放到while循環中直到'ind'爲空將解決這個問題。 – Daniel

+0

我認爲這種解決方案更有效率。它不會需要n^2次。糾正我,如果我錯了。 –

+0

當我這樣做時,我得到了錯誤:在賦值A(I)= B中,B和I中的元素數量必須相同。 – MRaff16

1

使用cummax功能(在R2014b介紹):

s = s(cummax((s<=6).*(1:numel(s)))); 

例子:

>> s = [5 7 9 2 5 8 4 11 6] 
s = 
    5  7  9  2  5  8  4 11  6 
>> s = s(cummax((s<=6).*(1:numel(s)))) 
s = 
    5  5  5  2  5  5  4  4  6