Этот пример задает класс для того, чтобы хранить данные с определенной структурой. Используя сопоставимую структуру для хранения данных облегчает создавать функции, которые работают с данными. 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
:
Пользователи не могут случайно написать имя поля c ошибкой, не получая ошибку. Например, ввод следующего:
td.Modulis = ...
просто добавило бы поле к структуре. Однако это возвращает ошибку когда td
экземпляр TensileData
класс.
Класс легок к повторному использованию. Если вы задали класс, можно легко расширить его с подклассами, которые добавляют новые свойства.
Класс легко идентифицировать. Класс имеет имя так, чтобы можно было идентифицировать объекты с whos
и class
функции и браузер Рабочей области. Имя класса дает возможность относиться к записям с понятным именем.
Класс может подтвердить отдельные значения полей, когда присвоено, включая класс или значение.
Класс может ограничить доступ к полям, например, позволив конкретному полю быть считанным, но не измененным.
Ограничьте свойства определенными значениями путем определения метода доступа набора свойств. MATLAB вызывает метод доступа набора, устанавливая значение для свойства.
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
метод прежде, чем установить значение свойства.
Если значение совпадает с приемлемыми значениями, функция установила свойство на то значение. Код в методе установки может получить доступ к свойству непосредственно, чтобы не вызывать метод набора свойств рекурсивно.
Например:
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
свойство. Однако метод установки позволяет вам предоставить индивидуально настраиваемое сообщение об ошибке. Modulus
метод установки ссылается на текущее значение свойства и затем возвращает ошибку:
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 | Вычислите Для получения общей информации смотрите Набор и методы get для Dependent Properties |
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 | Ограничьте возможные значения для Для получения информации об этом коде смотрите Restrict Properties к Определенным Значениям. Для получения общей информации о методах набора свойств, см. Методы Набора свойств. |
function m = get.Modulus(obj) ind = find(obj.Strain > 0); m = mean(obj.Stress(ind)./obj.Strain(ind)); end | Вычислите Для получения информации об этом коде смотрите Свойство Модуля метод get. Для получения общей информации о свойстве получите методы, смотрите Свойство методы get. |
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 | Перегрузка Для получения информации об этом коде смотрите Отображающиеся Объекты TensileData Для получения общей информации о перегрузке 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 |
|