В этом примере определяется класс для хранения данных с определенной структурой. Использование согласованной структуры для хранения данных упрощает создание функций, работающих с данными. A MATLAB
®struct с именами полей, описывающими конкретный элемент данных, является полезным способом организации данных. Однако класс может определять как хранилище данных (свойства), так и операции, которые можно выполнять с этими данными (методами). Этот пример иллюстрирует эти преимущества.
Для этого примера данные представляют измерения растягивающего напряжения/деформации. Эти данные используются для расчета модуля упругости различных материалов. Проще говоря, напряжение - это сила, приложенная к материалу, а деформация - это результирующая деформация. Их соотношение определяет характеристику материала. Хотя этот подход является чрезмерным упрощением процесса, его достаточно для этого примера.
В этой таблице описывается структура данных.
Данные | Описание |
|---|---|
|
|
| Номер конкретного тестового образца |
| Вектор чисел, представляющий напряжение, приложенное к образцу во время испытания. |
| Вектор чисел, представляющих деформацию при соответствующих значениях приложенного напряжения. |
| Число, определяющее модуль упругости испытуемого материала, который рассчитывается на основе данных о напряжениях и деформациях |
Этот пример начинается с простой реализации класса и строится на этой реализации для иллюстрации того, как функции повышают полезность класса.
Первая версия класса обеспечивает только хранение данных. Класс определяет свойство для каждого из требуемых элементов данных.
classdef TensileData properties Material SampleNumber Stress Strain Modulus end end
Следующие инструкции создают TensileData объект и присвойте ему данные:
td = TensileData;
td.Material = 'Carbon Steel';
td.SampleNumber = 001;
td.Stress = [2e4 4e4 6e4 8e4];
td.Strain = [.12 .20 .31 .40];
td.Modulus = mean(td.Stress./td.Strain);
Лечить TensileData объект (td в предыдущих заявлениях) так же, как и любая структура MATLAB. Однако определение специализированной структуры данных как класса имеет преимущества перед использованием структуры данных общего назначения, такой как MATLAB. struct:
Пользователи не могут случайно ввести неверное имя поля без получения ошибки. Например, введите следующее:
td.Modulis = ...
просто добавит поле в структуру. Однако возвращает ошибку, когда td является экземпляром TensileData класс.
Класс прост в повторном использовании. После определения класса его можно легко расширить подклассами, добавляющими новые свойства.
Класс легко идентифицировать. Класс имеет имя, позволяющее идентифицировать объекты с помощью whos и class функции и браузер рабочей области. Имя класса позволяет легко ссылаться на записи со значимым именем.
Класс может проверять отдельные значения полей при назначении, включая класс или значение.
Класс может ограничить доступ к полям, например, позволяя считывать, но не изменять определенное поле.
Ограничьте свойства определенными значениями, определив метод доступа к набору свойств. MATLAB вызывает метод доступа set всякий раз, когда задается значение свойства.
Material метод набора свойств ограничивает назначение свойства одной из следующих строк: aluminum, stainless steel, или carbon steel.
Добавьте это определение функции в блок методов.
classdef TensileData properties Material SampleNumber Stress Strain Modulus end methods function obj = set.Material(obj,material) if (strcmpi(material,'aluminum') ||... strcmpi(material,'stainless steel') ||... strcmpi(material,'carbon steel')) obj.Material = material; else error('Invalid Material') end end end end
При попытке установить Material свойство, MATLAB вызывает set.Material перед установкой значения свойства.
Если значение соответствует допустимым значениям, функция устанавливает для свойства это значение. Код в методе set может обращаться непосредственно к свойству, чтобы избежать рекурсивного вызова метода набора свойств.
Например:
td = TensileData;
td.Material = 'brass';Error using TensileData/set.Material
Invalid MaterialУпрощение интерфейса с TensileData путем добавления конструктора, который:
Позволяет передавать данные в качестве аргументов конструктору
Присваивает значения свойствам
Конструктор - это метод, имя которого совпадает с именем класса.
methods function td = TensileData(material,samplenum,stress,strain) if nargin > 0 td.Material = material; td.SampleNumber = samplenum; td.Stress = stress; td.Strain = strain; end end end
Создать TensileData объект полностью заполнен данными с помощью следующей инструкции:
td = TensileData('carbon steel',1,... [2e4 4e4 6e4 8e4],... [.12 .20 .31 .40]);
Если значение свойства зависит от значений других свойств, определите это свойство с помощью Dependent атрибут. MATLAB не сохраняет значения зависимых свойств. Метод получения зависимого свойства определяет значение свойства при обращении к свойству. Доступ может происходить при отображении свойств объекта или в результате явного запроса.
TensileData объекты не сохраняют значение Modulus собственность. Конструктор не имеет входного аргумента для значения Modulus собственность. Значение Modulus:
Рассчитывается из Stress и Strain значения свойств
Должно быть изменено, если значение Stress или Strain изменения свойств
Поэтому лучше рассчитать значение Modulus свойство только при запросе его значения. Использовать свойство get метод доступа для вычисления значения Modulus.
Modulus свойство зависит от Stress и Strain, так что его Dependent атрибут - true. Разместить Modulus свойство в отдельном properties блокировать и установить Dependent атрибут.
get.Modulus метод вычисляет и возвращает значение Modulus собственность.
properties (Dependent) Modulus end
Определение метода получения свойства в methods блок, использующий только атрибуты по умолчанию.
methods function modulus = get.Modulus(obj) ind = find(obj.Strain > 0); modulus = mean(obj.Stress(ind)./obj.Strain(ind)); end end
Этот метод вычисляет среднее отношение напряжения к данным деформации после исключения нулей в данных знаменателя.
MATLAB вызывает get.Modulus метод при запросе свойства. Например,
td = TensileData('carbon steel',1,... [2e4 4e4 6e4 8e4],... [.12 .20 .31 .40]); td.Modulus
ans = 1.9005e+005
Установка значения Dependent , класс должен реализовать метод набора свойств. Нет необходимости разрешать явную установку Modulus собственность. Однако метод set позволяет выдать настраиваемое сообщение об ошибке. Modulus set method ссылается на текущее значение свойства, а затем возвращает ошибку:
methods function obj = set.Modulus(obj,~) fprintf('%s%d\n','Modulus is: ',obj.Modulus) error('You cannot set the Modulus property'); end end
TensileData Объекты TensileData класс перегружает disp способ. Этот метод управляет отображением объектов в окне команд.
disp отображает значение Material, SampleNumber, и Modulus свойства. Он не отображает Stress и Strain данные свойств. Эти свойства содержат необработанные данные, которые нелегко просмотреть в окне команд.
disp метод использует fprintf для отображения форматированного текста в окне команд:
methods function disp(td) fprintf(1,... 'Material: %s\nSample Number: %g\nModulus: %1.5g\n',... td.Material,td.SampleNumber,td.Modulus); end end
Полезно просмотреть график данных напряжения/деформации, чтобы определить поведение материала в диапазоне приложенного натяжения. TensileData класс перегружает MATLAB plot функция.
plot метод создает линейный график данных зависимости напряжения от деформации и добавляет заголовок и метки оси для создания стандартизированного графика для записей данных растяжения:
methods function plot(td,varargin) plot(td.Strain,td.Stress,varargin{:}) title(['Stress/Strain plot for Sample',... num2str(td.SampleNumber)]) ylabel('Stress (psi)') xlabel('Strain %') end end
Первым аргументом этого метода является TensileData , который содержит данные.
Метод передает переменный список аргументов (varargin) непосредственно к встроенному plot функция. TensileData
plot метод позволяет передавать аргументы спецификатора строки или пары имя-значение свойства.
Например:
td = TensileData('carbon steel',1,... [2e4 4e4 6e4 8e4],[.12 .20 .31 .40]); plot(td,'-+b','LineWidth',2)

TensileData Синопсис класса
| Пример кода | Обсуждение |
|---|---|
classdef TensileData | Класс значений включает независимые копии объекта. Дополнительные сведения см. в разделе Сравнение классов дескрипторов и значений |
properties Material SampleNumber Stress Strain end | |
properties (Dependent) Modulus end | Вычислить Общие сведения см. в разделе Задание и получение методов для зависимых свойств |
methods
| Общие сведения о методах см. в разделе Обычные методы. |
function td = TensileData(material,samplenum,... stress,strain) if nargin > 0 td.Material = material; td.SampleNumber = samplenum; td.Stress = stress; td.Strain = strain; end end | Сведения об этом коде см. в разделе Упрощение интерфейса с конструктором. Общие сведения о конструкторах см. в разделе Методы конструктора классов |
function obj = set.Material(obj,material) if (strcmpi(material,'aluminum') ||... strcmpi(material,'stainless steel') ||... strcmpi(material,'carbon steel')) obj.Material = material; else error('Invalid Material') end end | Ограничить возможные значения для Дополнительные сведения об этом коде см. в разделе Ограничение свойств определенными значениями. Общие сведения о методах набора характеристик см. в разделе Методы набора характеристик. |
function m = get.Modulus(obj) ind = find(obj.Strain > 0); m = mean(obj.Stress(ind)./obj.Strain(ind)); end | Вычислить Сведения об этом коде см. в разделе Метод получения свойства модуля. Общие сведения о методах получения свойств см. в разделе Методы получения свойств. |
function obj = set.Modulus(obj,~) fprintf('%s%d\n','Modulus is: ',obj.Modulus) error('You cannot set Modulus property'); end | Добавить метод набора для Общие сведения о методах набора характеристик см. в разделе Методы набора характеристик. |
function disp(td) fprintf(1,'Material: %s\nSample Number: %g\nModulus: %1.5g\n',... td.Material,td.SampleNumber,td.Modulus) end | Перегрузка Дополнительные сведения об этом коде см. в разделе Отображение объектов TensableData Общие сведения о перегрузке disp см. в разделе Перегрузка функции disp |
function plot(td,varargin) plot(td.Strain,td.Stress,varargin{:}) title(['Stress/Strain plot for Sample',... num2str(td.SampleNumber)]) ylabel('Stress (psi)') xlabel('Strain %') end | Перегрузка Метод построения графика зависимости напряжения от деформации |
end end |
|