我有一个矢量,
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 = []
。这究竟出了什么问题?显然,a3
有13
个元素,这意味着空格必须是2
元素宽。问题出在那里吗?
答案 0 :(得分:3)
推荐解决方案:
将num2str
,cellstr
,str2double
和sum
与omitnan
标记一起使用。
req = num2str(a2);
req = sum(str2double(cellstr(req(:))),'omitnan');
num2str
将给定的矩阵a2
转换为字符数组。将req(:)
reshapes字符数组req
放入列向量中。它仍然包含空格。 cellstr
用于将列字符数组转换为单元格数组,以便可以应用str2double
。 str2double
将空格转换为NaN
,将字符数转换为相应的双精度数。带有sum
标记的omitnan
会在添加时忽略NaN
。
只是另一种解决方案:
也可以仅使用num2str
,str2num
和sum
来完成。 但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
是一个字符串,那么这个解决方案将不给出错误(顺便说一下,对于其他答案也是如此)