2017-04-07 38 views
0

我被困在試圖弄清楚這一點。我有一個數組:在Matlab中添加數組中的值並與循環內的閾值比較

A = [1 1 1 2 1 1 1 3 2 1 1 2 1 1 1]

add the values in the array so that it equal to 10。一旦增加的值達到10,我希望數組再次開始增加數值,直到達到10爲止。我有兩個問題,我在這裏面對,

1)我該如何添加數組,使sum = 10每次。注意在數組中,有3。如果我在3之前加上所有的值,我會得到8,我只需要23。我需要確保剩餘部分1被添加到下一個數組中以獲得總和10

2)一旦到達10,我該如何中斷循環,並要求它繼續總和到下一個值以獲得另一個值10

我創建了一個循環,但它只適用於數組的第一部分。我不知道如何讓它繼續下去。代碼如下:

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

for i = 1:length(a) 
    while c < 10 
     c = c + a(i); 
    break 
    end 
end 

請幫忙。謝謝

+0

給定'a'的輸出是什麼? –

+0

@SardarUsama我不清楚你的問題。我將'a'初始化爲具有指定值的數組,如代碼中所示,所以如果我在Matlab中運行'a',它會給我那些指定的值。 – loss

+0

這是我面臨的問題之一,我需要添加添加數組值,以便一旦數組值的總和等於'10',我將確定最後一個數組的總和索引。所以在數組'a'中,我有'a [1],直到[8]'有助於總和等於'10'。然而,正如問題的第(1)點所述,'a [8]'中有餘數,即'1'。我想把餘數加到'a [9]'中的下一個值,以得到另一個總和等於'10'。我不確定我的解釋是否清楚,但我希望我能從中找到一些答案。 – loss

回答

1

這應該做你想什麼。它顯示每次總和等於10時的索引。用你的測試用例檢查這個。 rem在每次迭代中存儲剩餘和,該迭代在下一次迭代中繼續進行。其餘的代碼與你所做的相似。

a = [ 1 1 1 2 1 1 1 3 2 1 1 2 1 1 1]; 
c = 0; 
rem = 0; 
i = 1; 
length(a); 
while(i <= length(a)) 
    c = rem; 
    while (c < 10 && i <= length(a)) 
     c = c + a(i); 
     i = i + 1; 
     if(c >= 10) 
     rem = c - 10; 
     break 
     end 
    end 
    if(c >= 10) 
     disp(i-1) 
end 
+1

謝謝@Tarun。這工作! – loss

+0

@loss更新了邊界案例的解決方案! – Tarun

1

使用cumsum,而不是你while循環:

a = [ 1 1 1 2 1 1 1 3 2 1 1 2 1 1 1]; 
a_ = a; 
endidxlist = false(size(a)); 
startidxlist = false(size(a)); 
startidxlist(1) = true; 
while any(a_) && (sum(a_) >= 10) 
    b = cumsum(a_); 
    idx = find(b >= 10,1); 
    endidxlist(idx) = true; 
    % move residual to the next sequence 
    a_(idx) = b(idx) - 10; 
    if a_(idx) > 0 
     startidxlist(idx) = idx; 
    elseif (idx+1) <= numel(a) 
     startidxlist(idx+1) = true; 
    end 
    a_(1:idx-1) = 0; 
end 
if (idx+1) <= numel(a) 
    startidxlist(idx+1) = false; 
end 

endidxlist提供了各序列的末端,指數和startidxlist啓動指標

+0

好點,我編輯我的答案使用預先分配的二進制數組。 – user2999345

+0

謝謝@ user2999345 – loss

2

這可以使用cumsummoddifffind如下來完成:

temp = cumsum(a); 
required = find([0 diff(mod(temp,10))] <0) 

cumsum返回其然後使用mod重新縮放的累積和。 diff確定總和大於或等於10的地方,最後find確定這些索引。

編輯:如果a沒有負面元素,上面的解決方案工作。如果a可能具有負值元素,則:

temp1=cumsum(a);    %Commulative Sum 
temp2=[0 diff(mod(temp1,10))];%Indexes where sum >=10 (indicated by negative values) 
temp2(temp1<0)=0;    %Removing false indexes which may come if `a` has -ve values 
required = find(temp2 <0)  %Required indexes 
+0

謝謝@SardarUsama – loss