在向量中添加每个元素不会产生任何数字

时间:2017-09-09 11:23:13

标签: matlab vector sum

我有一个矢量,

a2 = [8 10 18 18]

我想在此向量中添加所有个别数字,即

8 + 1+0 + 1+8 + 1+8 = 27

我决定使用以下代码:

a3 = num2str(a2)
sum2 = 0;
for k = 1:numel(a3)
    sum2 = sum2 + str2num(a3(k));
end
sum2

然而,当我输出这个时,我得到sum2 = []。这究竟出了什么问题?显然,a313个元素,这意味着空格必须是2元素宽。问题出在那里吗?

3 个答案:

答案 0 :(得分:3)

推荐解决方案:

num2strcellstrstr2doublesumomitnan标记一起使用。

req = num2str(a2);    
req = sum(str2double(cellstr(req(:))),'omitnan'); 

num2str将给定的矩阵a2转换为字符数组。将req(:) reshapes字符数组req放入列向量中。它仍然包含空格。 cellstr用于将列字符数组转换为单元格数组,以便可以应用str2doublestr2double将空格转换为NaN,将字符数转换为相应的双精度数。带有sum标记的omitnan会在添加时忽略NaN

只是另一种解决方案:

也可以仅使用num2strstr2numsum来完成。 str2num使用eval,因此它应为avoided 。无论如何只是为了它的乐趣:

req = num2str(a2);
req = sum(str2num(req(:)));

与上一个解决方案一样,当str2num应用于包含空格的列字符数组时,空格将被删除,剩余的字符编号将转换为相应的双精度数。 sum功能的操作是显而易见的。

为什么您的代码不起作用?

在空格字符上应用str2num时,会返回[]。将[]添加到任意数字后,结果也为[]。由于代码中a3包含空格,因此您将[]作为输出。

答案 1 :(得分:1)

您可以利用ASCII映射:

b = uint64(num2str(a2') - '0')
b =
  4×2 uint64 matrix
   0   8
   1   0
   1   8
   1   8

然后总结:

sum(b(:))
ans =
    27

答案 2 :(得分:1)

只是为了好玩,一个更短,更快,不太健壮和不太可读的解决方案:

sum2 = sum(sprintf('%d',a2)-'0');

细分:

  • sprintf a2的所有元素转换为不带空格的字符串作为分隔符,例如num2str
  • 减去'0' 隐式地将字符数组转换为等效的ASCII代码。将ASCII值减去0然后得到数字0-10
  • sum() 完成操作。

请注意,如果a2是一个字符串,那么这个解决方案将给出错误(顺便说一下,对于其他答案也是如此)