【问题标题】:matlab: keeping only first N digits of numbersmatlab:只保留前N位数字
【发布时间】:2015-08-25 18:17:43
【问题描述】:

我试图在 Matlab 中找到一种方法来截断向量的值,只保留前 N 位数字(我不想舍入它,只是为了削减它。)。我写了一些东西,它可以转换字符串中的值,剪切它们并返回截断的数字,但它太慢了。

还有更聪明的解决方案吗?

提前非常感谢!

【问题讨论】:

  • 请发布您尝试过的内容。
  • 我尝试了这里建议的一切.. 但它没有工作stackoverflow.com/questions/8600249/…
  • 我正在尝试合并两个具有不同分辨率的数字的向量并对结果向量进行排序。这是它不适用于链接中的方法的原因。如果我这样做: v1_string = strtrim(cellstr(num2str(v1))); v2_string = strtrim(cellstr(num2str(v2)));然后我循环 v1_new(i) = str2num(v1_string{i}(1:N)); v2_new(i) = str2num(v2_string{i}(1:N));这行得通,但是太慢了。

标签: matlab digits


【解决方案1】:

由于您严格说您不想对数字进行四舍五入,因此这是一种可能的解决方案,使用 floor 函数,我只是删除指定的十进制数之后的数字 N 我想保留:

function trunc = truncate(x,N)
    trunc = floor(x*10^N)/10^N;
end

这是一个示例运行:

>> b=rand(1,2)

b =

   0.957166948242946   0.485375648722841

>> truncate(b,3)

ans =

   0.957000000000000   0.485000000000000

请注意,如果您正在考虑大于 1 的数字,则必须稍微修改上述函数:

function trunc = truncate(x,N)
        %For numbers equal or greater than 1, getting N first digits
        trunc=x;
        idx = x>=1;
        trunc(idx) = floor(x(idx)/10^N);

        %For decimals, keeping N first digits after comma
        trunc(~idx) = floor(x(~idx)*10^N)/10^N;
end

truncate 函数的另一次运行:

>> b=[123 rand(1,2)]

b =

   1.0e+02 *

   1.230000000000000   0.004217612826263   0.009157355251891

>> truncate(b,2)

ans =

   1.000000000000000   0.420000000000000   0.910000000000000

需要注意的是,没有进行任何检查来验证函数的输入是否实际上具有大于 N 的位数,我认为这是正确的。

【讨论】:

  • 我试过了,但是没有用。可能与向量的不同分辨率有关,这使事情变得很奇怪。我还没弄清楚它是什么。
  • 最好使用fix而不是floor,以防有负数
  • 不知道修复功能。谢谢你的提示。你介意我汇总答案吗?
  • @user1835630 有没有可能找到这样一个结果奇怪的例子?
【解决方案2】:

您可以使用与此示例相同的逻辑:

X =-1.665584378238097

Y = round(X / 0.01) * 0.01

Y =

-1.670000000000000

并将其应用于向量/矩阵。

【讨论】:

    猜你喜欢
    • 2011-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 1970-01-01
    • 2014-12-27
    • 2020-09-11
    相关资源
    最近更新 更多