使用while循环对向量的部分求和

时间:2014-11-03 21:57:31

标签: matlab vector while-loop

我对matlab不太熟悉并且正在与while循环斗争。我试图使用while循环来对零之间的向量进行求和,并创建这些和的新向量。这是一个例子:

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

我想要一个输出向量

m=[4,8,7]

我试过甚至找到一个循环,它将只为启动器的第一部分求和,但我试过的所有while循环都是无限运行的。

e.g。

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

while n > 0

    m=sum(A)

end

5 个答案:

答案 0 :(得分: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))

如果存在连续的零,我的答案会将其视为具有零长度子列表,因此该子列表的总和(零)将出现在适当位置的结果中。

答案 1 :(得分:0)

首先,您需要在循环documentation中查看数学作品中的示例,以便更好地理解。

您的问题是声明(n> 0)始终为true。如果你添加另一个变量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

如果有任何连续的零,它们将生成m等于0的值;您可以使用

删除它

m(m==0) = '';

答案 2 :(得分: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];

答案 3 :(得分: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

答案 4 :(得分:0)

您可以使用while来迭代n并根据您触摸的值更新m

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(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