我对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
答案 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文档。
编辑:更好的解决方案
我使用find
和length
并将一些值连接在一起。
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