2017-09-16 54 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