Matlab:是否有一个函数来定位一个数字中的'n'数字(即'75673'中的第二个数字,所以5)

时间:2014-11-16 18:00:26

标签: matlab

我有一个号码A=7654321

我需要位置5的数字(从开头,或结束时的数字3),在这种情况下是3。

是否有一个函数可以执行以下操作:getdigit(A,n),其中A是数字,n是我想要的数字的位置?

我可以将数字转换为文本字符串,找到位置n处的数字,然后将其转换回数字(num2strstr2double),但这似乎不是一个好的解决方案对我来说,你知道更好的方法吗?

2 个答案:

答案 0 :(得分:4)

我能想到的最有效的方法就是做你不想做的事,虽然效率稍高一些!将您的数字转换为字符串,将每个数字分成不同的位置,然后拉出您想要的数字。因此:

function [out] = getDigit(A,n)
C = num2str(A) - 48;
out = C(n);
end

第一句话有点棘手。使用num2str将您的号码转换为字符数组。现在,您需要了解一下MATLAB内部结构,以了解我接下来要做的事情。通过将字符串转换为double,它会将每个字符转换为其ASCII表示形式,并将每个字符放入数字数组中的单独条目中,该数组为键盘上存在的每个字符分配唯一的ID 。您会注意到数字零从ID 48开始,并从那里线性增加。因此,我减去48以使数字回到0-9。事实上,如果您只是将字符串减去48,它将自动转换为double(感谢Luis!)。

一旦我这样做,我会选择我想要的位置,即n。因此,在执行C = getdigit(7654321, 5);之后,我们得到:

C = 

3

但是,如果你真的不想使用ASCII技巧,你可以使用有关除以10和剩余的权力的信息....实际上,Anders Forsgren将你链接到一个不错的Java帖子,但是让我们在MATLAB中做到这一点。

简单地将A的模数除以10^n,将其除以10^(n-1)并取floor。但是,有一点需要注意的是,此方法从末尾算起 ,因此您必须使n等于3。

因此:

function [out] = getDigit(A,n)
out = floor(mod(A, 10^n) / 10^(n-1));
end

执行C = getDigit(7654321, 3)告诉我们:

C =

3

修改

如果你想坚持你的约定并且从左到右,而不是从右到左,你可以计算出数字中有多少位数,然后简单地使用我上面的逻辑并通过你的值n并从数字减1减去(从badjr借来)。因此:

function [out] = getDigit(A,n)
n = (floor(log10(A)) + 1) - (n - 1);
out = floor(mod(A, 10^n) / 10^(n-1));
end

重新计算n的第一部分是确定我们有多少位数代表我们的数字。我们需要采用n并重新制定它,以便我们指的是从右到左,而不是从左到右的数字位置。这是为了使用我之前定义的逻辑。你需要确保通过减去n - 1来换行,因为如果你只用n减去,这实际上是基于提取零索引。如果你想尊重你的函数定义,其中n = 1是要提取的数字的第一个数字而不是第二个数字,我们必须偏移1。

通过C = getDigit(7654321, 5);,我们得到:

C =

3

答案 1 :(得分:0)

定义函数getdigit(A, n)(在文件getdigit.m中):

function d = getdigit(A, n)
    numDigits = floor(log10(abs(A))) + 1;
    d = mod(floor(A/10^(numDigits - n)), 10);
end

然后,

>>A=7654321;
>>getdigit(A, 5)

给出

ans =

     3