问题陈述:
将一个数字数组(例如x = [1 2 3]
)作为输入,并输出一个数字数组,该数字正确地“增加”该数字(在本例中为y = [1 2 4]
)。
正确输入/输出的示例:
x = [1 9 1 9] ----> y = [1 9 2 0]
和
x = [9 9 9] ----> y = [1 0 0 0]
我认为最简单的解决方案是将矢量转换为矩阵,递增它,然后转换回来。这听起来很复杂,但它比正常尝试添加更好。
我的尝试:
function ans = incrementor(x)
x=sprintf('%1d',x)
x=str2num(x)
num2str(x+1) - '0'
任何人都可以提出更有效的解决方案吗?
(我想可能有一个命令直接执行添加而不转换为标量,但我不知道。)
答案 0 :(得分:1)
我相信matlab没有你需要的本机功能,在某些时候你必须将你的值转换为标量模式以增加
答案 1 :(得分:0)
合并数字,加1,
yn=x*(10.^(length(x)-1:-1:0))' + 1
然后转换回来:
numDigits = floor(log10(yn)+1)
tens = 10.^(1:numDigits);
y = fliplr(floor(mod(yn,tens)./(tens/10)))
或者,正如OP(user3020151)指出的那样,您可以使用num2str
转换回来:
y = num2str(yn) - '0'
寻找单个命令的搜索,我不知道内置命令,但你可以构建一个匿名函数,如下所示:
>> incrementor = @(x) num2str(x*(10.^(length(x)-1:-1:0)).' + 1) - '0'; %' anonymous
>> x = [9 9 9];
>> y = incrementor(x)
y =
1 0 0 0
答案 2 :(得分:0)
无需使用字符串或转换为数字:只需找到最右边的非九位数(如果有),将1加1,并将其右边的任何数字设置为零。所有数字都是九的情况需要单独处理,因为那时数字的数字必须增加。
k = find(x~=9,1,'last');
if isempty(k)
y = [1 zeros(1,numel(x))];
else
y = [x(1:k-1) x(k)+1 zeros(1,numel(x)-k)];
end
答案 3 :(得分:-1)
x = [1 2 3];
r1=sprintf('%1d',x);
r1= str2num(r1) + 1;
r2=sscanf( sprintf( num2str(r1) ), '%1d' )'