【问题标题】:How to store only upto 4 decimal places in a matlab variable?如何在 matlab 变量中只存储最多 4 位小数?
【发布时间】:2012-01-25 21:07:58
【问题描述】:

我希望 matlab 中的变量仅存储(不要与显示混淆)最多 4 位小数。 它有内置命令吗? 我尝试了以下方法 - 但这给出了错误:

a = [5.21365458 5.236985475 1.236598547 9.3265874];

k=1;
for i=1:length(a)
ast(k)=sprintf('%5.4f',a(i));
anum(k)=str2num(ast(k));
k=k+1;
end

错误是:???下标赋值维度不匹配。

【问题讨论】:

  • “我希望 matlab 中的变量仅存储(不要与显示混淆)最多 4 位小数”。当您可以以全精度存储值并将它们显示至小数点后四位时,您是否有意降低精度?即使四舍五入到小数点后四位,您仍然可以完全精确地存储这些值。
  • 我只需要最多 4 个小数位就可以将这些值与一组其他值相等,并选择一个匹配到最多 4 个小数位的值。完全精确,我永远无法匹配两组数字。
  • 然后你应该以全精度存储数字,并编写一个函数来测试最多 4 个小数位的相等性。事实上,您应该做的是告诉我们您真正想要做什么(即测试相等性达到某种程度的精度)而不是您认为您需要做什么(即搞乱您的数据是如何存储的)。
  • 我有两条曲线:C1 = f1(x1,y) 和 C2 = f2(x2,y) 。即它们共享相同的 y 值。我需要找出 'x' 值对于哪个 'y' 值最接近。
  • 条件 $|a-b|

标签: matlab


【解决方案1】:

您应该将数字四舍五入到小数点后四位。这在工作区很容易做到:

>> x = rand(1,4)
x =
   0.053378064308120   0.051670599653141   0.924623792776560   0.585692341974519
>> x = round(x*1e4) / 1e4
x =
   0.053400000000000   0.051700000000000   0.924600000000000   0.585700000000000

或者您可以编写一个函数 roundToDP(x,numberOfDecimalPlaces) 为您完成它:

function x = roundToDP(x,n)
% "Round the matrix x to n decimal places"
x = round(x * 10^n) / 10^n;

现在您可以在工作区中使用该功能:

>> x = rand(1,4)
x =
   0.810201981892601   0.165116049955136   0.457688639337064   0.985975706057179
>> roundToDP(x,4)
ans =
   0.810200000000000   0.165100000000000   0.457700000000000   0.986000000000000

【讨论】:

  • 它并没有完全解决。原因如下:a = [5.235689 2.124578 9.658754 21.235654]; b=round(a*1e4)/1e4 b = 5.235700000000000 2.124600000000000 9.658799999999999 21.235700000000001
  • 这是浮点数据的问题,而不是舍入算法的问题。将值 9.6587 完全存储为浮点数是不可能的,这就是为什么它会在末尾呈现一串 9。
  • 不是很优雅,但我想这是 Matlab 的错,因为它没有将其作为预构建函数包含在内......
【解决方案2】:

您可以将数字乘以 10000 并将其存储为整数,然后在显示前除以 10000

【讨论】:

    【解决方案3】:

    您的问题与 anum 变成 char 数组的事实有关。改用元胞数组:

    a = [5.21365458 5.236985475 1.236598547 9.3265874];

    anum = 单元格(大小(a));
    对于 i=1:numel(a)
    anum{i} = str2num(sprintf('%5.4f',a(i)));
    结束

    另外,如您所见,k 变量是不需要的

    【讨论】:

      【解决方案4】:

      可以使用Matlab reference to fixed point object中提到的matlab定点对象

      【讨论】:

        猜你喜欢
        • 2013-04-13
        • 1970-01-01
        • 2017-11-19
        • 2017-05-04
        • 1970-01-01
        • 2021-03-26
        • 2014-09-17
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多