Как я могу отображать числа с более высокой точностью в курсоре данных MATLAB?

У меня проблема с потерей точности. Я импортировал набор значений из файла CSV в MATLAB 7, используя следующий код:

function importfile(fileToRead1)
%#IMPORTFILE(FILETOREAD1)
%#  Imports data from the specified file
%#  FILETOREAD1:  file to read

DELIMITER = ',';
HEADERLINES = 0;

%# Import the file
rawData1 = importdata(fileToRead1, DELIMITER, HEADERLINES);

%# For some simple files (such as a CSV or JPEG files), IMPORTDATA might
%# return a simple array.  If so, generate a structure so that the output
%# matches that from the Import Wizard.
[~,name] = fileparts(fileToRead1);
newData1.(genvarname(name)) = rawData1;

%# Create new variables in the base workspace from those fields.
vars = fieldnames(newData1);
for i = 1:length(vars)
    assignin('base', vars{i}, newData1.(vars{i}));
end

Этот очень простой скрипт просто берет указанный файл:

> 14,-0.15893555 
> 15,-0.24221802
> 16,0.18478394

И преобразует второй столбец в:

14  -0,158935550000000
15  -0,242218020000000
16  0,184783940000000

Однако, если я выберу точку с помощью курсора данных, она отобразит только 3 или 4 цифры точности:

неточные ярлыки

Есть ли способ запрограммировать более высокую точность, чтобы получить более точные данные?

3 ответа

Решение

Ваши данные не теряют точности, дисплей курсора данных просто не показывает полную точность, поэтому текстовые поля имеют более разумный размер. Однако, если вы хотите повысить точность отображения в текстовой подсказке, вы можете настроить ее.

Если вы щелкнете правой кнопкой мыши по текстовому полю "Курсор данных", вы увидите следующее меню:

Если вы затем выберите опцию Edit Text Update Function..., он откроет m-файл по умолчанию, содержащий следующее:

function output_txt = myfunction(obj, event_obj)
% Display the position of the data cursor
% obj          Currently not used (empty)
% event_obj    Handle to event object
% output_txt   Data cursor text string (string or cell array of strings).

pos = get(event_obj, 'Position');
output_txt = {['X: ', num2str(pos(1), 4)], ...
              ['Y: ', num2str(pos(2), 4)]};

% If there is a Z-coordinate in the position, display it as well
if length(pos) > 2
    output_txt{end+1} = ['Z: ', num2str(pos(3), 4)];
end

Обратите внимание, что текст для координатных данных X и Y отформатирован с использованием num2str со вторым аргументом, являющимся 4, Это преобразует значение координаты в строковое представление с точностью до 4 цифр. Если вы хотите, чтобы отображалось больше цифр, просто увеличьте это число, а затем сохраните вновь созданный m-файл на своем пути.

Теперь ваш текст всплывающей подсказки должен отображать больше точности для ваших чисел. Если вы хотите выполнить все вышеперечисленное программно, вы сначала должны создать функцию обновления текста, сохранить ее в файл (например, 'updateFcn.m'), затем включите курсоры данных с помощью функции datacursormode и установите их для использования вашей пользовательской функции обновления текста. Вот пример:

plot(1:10, rand(1, 10));  % Plot some sample data
dcmObj = datacursormode;  % Turn on data cursors and return the
                          %   data cursor mode object
set(dcmObj, 'UpdateFcn', @updateFcn);  % Set the data cursor mode object update
                                       %   function so it uses updateFcn.m

Если вы хотите сделать постоянное изменение - Внимание: это небольшой взлом MATLAB - откройте:

C: \ Program Files \ Matlab \ R2007b \ toolbox \ matlab \ graphics \ @graphics \ @datacursor \ default_getDatatipText.m

или аналогичный файл в зависимости от вашей версии и изменения DEFAULT_DIGITS.

Не цитируйте меня по этому поводу, но:

1) Вы не потеряли точность, MATLAB сохраняет полное значение, это только дисплей, который был урезан.

2) В моей версии MATLAB (R2009a) я могу изменить способ отображения длинных чисел в командном меню, перейдя в

Файл> Настройки> Редактор переменных

где выпадающее меню позволяет выбрать между коротким, длинным, коротким e, длинным e, коротким g, длинным g, коротким англом, длинным англом, банком, + и крысой.

Я понятия не имею, влияет ли это на то, что показывает Курсор Данных, все же.

Вы можете добавить в свой скрипт следующее:

dcm_obj = datacursormode(fig);
set(dcm_obj,'Updatefcn',@myfunction_datacursor);

Вам нужно создать и сохранить myfunction_datacursor файл со следующим в вашем пути (получить путь, вызвав path в приглашении MATLAB)

function output_txt = myfunction_datacursor(obj,event_obj)
% Display the position of the data cursor
% obj          Currently not used (empty)
% event_obj    Handle to event object
% output_txt   Data cursor text string (string or cell array of strings).

pos = get(event_obj,'Position');
output_txt = {['X: ',num2str(pos(1),8)],...
        ['Y: ',num2str(pos(2),4)]};

% If there is a Z-coordinate in the position, display it as well
if length(pos) > 2
        output_txt{end+1} = ['Z: ',num2str(pos(3),8)];
end
Другие вопросы по тегам