Этот пример задает класс для того, чтобы хранить данные с определенной структурой. Используя сопоставимую структуру для хранения данных облегчает создавать функции, которые работают с данными. 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. Однако задавая специализированную структуру данных, когда класс имеет преимущества перед использованием структуры данных общего назначения, как struct
MATLAB:
Пользователи не могут случайно написать имя поля 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
:
Вычисляется от значений свойств Strain
и Stress
Должен измениться, если значение свойства 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
перегружает функцию plot
MATLAB.
Метод 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
.
Метод plot
TensileData
позволяет вам передавать аргументы спецификатора строки или пары "имя-значение" свойства.
Например:
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 | Операторы |