Этот пример задает класс для хранения данных с определенной структурой. Использование согласованной структуры для хранения данных облегчает создание функций, работающих с данными. 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 каждый раз, когда задается значение свойства.
The 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
.
The Modulus
свойство зависит от Stress
и Strain
, так что его Dependent
атрибут true
. Поместите Modulus
свойство в отдельном properties
блокируйте и устанавливайте Dependent
атрибут.
The 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 позволяет вам предоставить настраиваемое сообщение об ошибке. The Modulus
метод set ссылается на текущее значение свойства и затем возвращает ошибку:
methods function obj = set.Modulus(obj,~) fprintf('%s%d\n','Modulus is: ',obj.Modulus) error('You cannot set the Modulus property'); end end
TensileData
ОбъектыThe TensileData
класс перегружает disp
способ. Этот метод управляет отображением объектов в командном окне.
The disp
метод отображает значение Material
, SampleNumber
, и Modulus
свойства. Он не отображает Stress
и Strain
данные о свойствах. Эти свойства содержат необработанные данные, которые трудно просмотреть в командном окне.
The 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
Полезно просмотреть график данных о напряжении/деформации, чтобы определить поведение материала в области значений приложенных натяжений. The TensileData
класс перегружает MATLAB plot
функция.
The 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
функция. The TensileData
plot
метод позволяет вам передавать аргументы спецификатора линии или пар "имя-значение" свойства.
Для примера:
td = TensileData('carbon steel',1,... [2e4 4e4 6e4 8e4],[.12 .20 .31 .40]); plot(td,'-+b','LineWidth',2)
TensileData
Обобщение классов
Пример кода | Обсуждение |
---|---|
classdef TensileData | Класс Value включает независимые копии объекта. Для получения дополнительной информации смотрите Сравнение классов Handle и Value |
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 | Вычислите Для получения информации об этом коде смотрите Modulus Property Get Method. Общие сведения о методах получения свойств см. в разделе Методы получения свойств. |
function obj = set.Modulus(obj,~) fprintf('%s%d\n','Modulus is: ',obj.Modulus) error('You cannot set Modulus property'); end | Добавьте метод set для Общие сведения о методах набора свойств см. в разделе Методы набора свойств. |
function disp(td) fprintf(1,'Material: %s\nSample Number: %g\nModulus: %1.5g\n',... td.Material,td.SampleNumber,td.Modulus) end | Перегрузка Для получения информации об этом коде смотрите Отображение объектов TensileData Общие сведения о перегрузке диска см. в разделе Перегрузка функции 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 |
|