2014-11-03 29 views
1

我對matlab不是很有經驗,並且在while循環中掙扎。我正在嘗試使用while循環對零之間的矢量部分進行求和,並創建這些和的新矢量。這裏有一個例子:使用while循環對矢量的部分進行求和

n=[1,3,0,5,1,2,0,4,3] 

我想要一個徹頭徹尾把矢量

m=[4,8,7] 

我試圖甚至找到一個循環,將總結僅僅是第一部分對於初學者,但所有的while循環我有試着無限地運行。

例如

所有的
n = [1,3,0,5,1,2,0,4,3]; 

while n > 0 

    m=sum(A) 

end 
+0

按照你定義'n'的方式,你的謂詞'n> 1'永遠不會評估爲邏輯'0'(即MATLAB的錯誤),你確實會陷入無限循環。 – Jubobs 2014-11-03 22:07:06

+0

無論如何連續有兩個零?另外,請記住,您不應該在MATLAB中使用'while'循環來解決這類問題。你可以使用更好的方法。 – 2014-11-03 22:15:40

+0

有些情況下連續的零,我很樂意學習如何做到這一點,沒有一個while循環,如果這確實會更好。 – user4212064 2014-11-03 22:22:21

回答

3

cumsum功能是一個非常好的主意那類的東西。它將在零之間添加,因此您可以在每個零處獲取值(之前或之後無關緊要,因爲零不會影響總和),然後查找總和在零之間變化的總和 - 這就是數之和。我們將確保在第一個零點處減去總和。

sums = cumsum(n(:)); 
sums = [0; sums(n == 0); sums(end)]; 
m = diff(sums) 

這會給你的列向量,如果你想有一個行向量使用在最後一行移調(')。

人們可以代替迫使在開始的零和這樣結束quickbug作用:

sums = cumsum([0; n(:); 0]); 
m = diff(sums(n == 0)) 

如果有連續的零,我的回答把那些具有零長度子列表,這樣子表的總和(零)將出現在適當位置的結果中。

0

首先,你需要看一下例子,The MathWorks公司while循環documentation爲了更好的理解。

你的問題是語句(n> 0)總是爲真。如果再添變數index,你可以得到的東西像

n = [1,3,0,5,1,2,0,4,3]; 
index = 1; 
m = 0; 
while n(index) ~= 0 
    m = m + n(index); 
    index = index + 1; 
end 

,將讓你m = 4;你必須添加另一個循環,產生整個向量(使用此方法)工作。您可以添加另一個循環,直到運行到index > length(n)

但是,如果您尚未閱讀關於while循環,for循環以及您認爲相關的其他任何內容的mathworks文檔。

編輯:更好的解決方案

我用findlength,也串連了一些值加在一起。

n = [1,3,0,5,1,2,0,4,3]; 
idx = find(n ==0); %find where n = 0; 
idx = [0 idx length(n)+1]; %add start and endpoints of the vector 
for i = 1:length(idx)-1 %loop through each space that contains numbers 
    m(i) = sum(n(idx(i)+1:idx(i+1)-1)); %sum up the values in between the indices 
end 

如果有連續的零,它們會產生一個等於0的值;您可以使用

m(m==0) = '';

0

由於while對你如此重要刪除此,使用:

n=[1,3,0,5,1,2,0,4,3]; 
m = 0; 
n(end + 1) = 0; % add a zero for detection 
i = 1; 
k = 1; 
while i <= length(n)  
     while n(i) > 0 
      m(k) = m(k) + n(i); 
      i = i + 1; 
     end 
     m(end + 1) = 0; % add a new column 
     i = i + 1; 
     k = k + 1; 
end 
m(end) = []; 

給人,m = [4 8 7];

0
n=[1,3,0,5,1,2,0,4,3] ; 
n = [0, n, 0] ; 
ix = find(n==0) ; 
m = zeros(1,length(ix)-1) ; 
for k=2:length(ix) 
    m(k-1) = sum(n(ix(k-1):ix(k))) ; 
end 
0

您可以使用while基於觸摸

n = [1,3,0,5,1,2,0,4,3]; 
m = 0; 
idx = 1; 
while idx <= numel(n) 
    if n(idx) > 0 
     m(end) = m(end) + n(idx); 
    else 
     m(end+1) = 0; 
    end 
    idx = idx + 1; 
end 

如果n(idx)是肯定的(我從代碼片斷拍攝,你有興趣的正值,如果值遍歷n和更新m您對非零值感興趣,只需將其更改爲n(idx)~=0),將其添加到m中的最後一個元素,否則將添加一個新元素到m以適應下次運行。這是原則上for循環,這樣就可以把它改寫爲

n = [1,3,0,5,1,2,0,4,3]; 
m = 0; 
for idx = 1:numel(n) 
    if n(idx) > 0 
     m(end) = m(end) + n(idx); 
    else 
     m(end+1) = 0; 
    end 
end 

但現在,因爲你是在處理一個行向量可以使用的for力量迭代的n元素:

n = [1,3,0,5,1,2,0,4,3]; 
m = 0; 
for ni = n 
    if ni > 0 
     m(end) = m(end) + ni; 
    else 
     m(end+1) = 0; 
    end 
end 

我們可能應該停下來,但有一些有趣的(但絕對不太可讀)的方式來擺脫if子句:

m = 0; 
for ni = n 
    I = ni > 0; 
    m(end+~I) = I*(m(end) + ni); 
end