2017-09-16 149 views
1

我已经制作了这个脚本来计算给定数据集的频率,但是matlab不够精确,是否有可能让matlab读取更精确的数字并且不切断数字?现在我想它使用8个位数(0.12345678),而不是4(0.1234),这是不Matlab读取精度更高的数字

fid = fopen('forceCoeffs.dat','rt'); 
A = textscan(fid, '%f%f%f%f%f%f', 'HeaderLines',9,'Collect', 9); 
A = A{1}; 
fclose(fid); 

t = A(:,1); 

Fs = 1/(A(1,1)); 
x = A(:,2) 

x = detrend(x,0); 
xdft = fft(x); 
freq = 0:Fs/length(x):Fs/2; 
xdft = xdft(1:length(x)/2+1); 
plot(freq,abs(xdft)); 
[~,I] = max(abs(xdft)); 
fprintf('Maximum occurs at %d Hz.\n',freq(I)); 

文件:https://drive.google.com/file/d/0B9CEsYCSSZUSb1JmcHRkbFdWYUU/view?usp=sharing

+0

['格式long'](https://www.mathworks.com/help/matlab/ref/format.html)? –

+0

MATLAB使用浮点数。它不是四舍五入的。如果您只有四位数字的精度,那么要么是文件中的所有内容,要么是错误地读取文件。确保你不只是看着控制台上打印的内容,因为MATLAB可以让这些内容更容易阅读。 – nalyd88

回答

2

谢谢你,包括forceCoeffs.dat文件作为它让我运行代码。这里是你所看到的一个解释。

首先我想指出的是,MATLAB不会舍入任何东西。您可以检查数据类型A以确保您有足够的精度。

>> class(A) 

ans = 

double 

而且,由于使用的是%f每一列的文件中读取,MATLAB将使用由double类型提供的所有位。好的,现在看看你的文件的内容。第一列最多只有2位精度。

0.05   -7.013874e-09 1.410717e+02 -6.688450e-02 -3.344226e-02 -3.344224e-02 
... 
349.95   -1.189524e-03 1.381022e+00 -2.523909e-01 -1.273850e-01 -1.250059e-01 
350    -1.423947e-03 1.380908e+00 -2.471767e-01 -1.250123e-01 -1.221644e-01 

由于不再需要MATLAB只在变量浏览器中查看变量时打印四位小数。试着看看其他栏目,看看我在说什么。我注释掉了代码的A = A{1}部分并查看了第二列。点击数字可以看到完整的精度。

enter image description here

0

您可以使用长型显示16位数字

0

要获得超过4位数的精度,你可以使用

format long 

但是,要得到正好8位数字,你需要四舍五入。如果您的号码是a然后让使用:

format long 
round(1e8*a)*1e-8 
+0

我试图把“长格式”放在我的脚本开始,但matlab读取我的文件“forceCoeffs.dat”只有4位数字的精度 – ursmooth

+0

奇怪,在Linux /八度它读取15位数字,一旦你设置格式长''长格式'' – xiawi

+1

只改变控制台中打印的内容。 MATLAB使用浮点数 - 它不会将数字四舍五入到四位数。 – nalyd88