Этот пример задает класс для хранения данных с определенной структурой. Использование согласованной структуры для хранения данных облегчает создание функций, работающих с данными. 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 |
|