Effacer les filtres
Effacer les filtres

Is there a built-in function to validate a class property that should be a cell array?

18 vues (au cours des 30 derniers jours)
I'm new to classes and learning about how to define properties and validate their values.
I have a class with a property A that is a cell array of doubles (possibly matrices). For example:
A =
1×2 cell array
{[0.7000]} {[0.9000]}
classdef MKFObserver < matlab.mixin.Copyable
properties (SetAccess = immutable)
Ts {mustBeNumeric}
n {mustBeInteger}
%...etc
end
properties
A % how to validate this?
B
C
D
P {mustBeNumeric}
Q {mustBeNumeric}
R {mustBeNumeric}
%...etc
end
Can I use a built in function like {mustBeNumeric} or do I need to write my own validation function?
  3 commentaires
Bill Tubbs
Bill Tubbs le 4 Juin 2022
Modifié(e) : Bill Tubbs le 4 Juin 2022
Thanks. That will do the first part. But I'll have to upgrade my MATLAB now! (Introduced in R2020b). I admit I have been putting it off for too long...
per isakson
per isakson le 4 Juin 2022
Something like this
A (1,2) {mustBeUnderlyingType(A,'cell')}
Not tested

Connectez-vous pour commenter.

Réponse acceptée

Edric Ellis
Edric Ellis le 6 Juin 2022
Rather than a validator, you could perhaps just use the class specification? (In my code below I'm using a function with an arguments block, but the syntax is exactly the same as a properties block in a classdef). Note that this will accept anything that can be converted to a cell, if you care about distributed arrays, then you should use the approach suggested by @Sean de Wolski.
myFcn({1,2}); % works
myFcn([1,2]); % fails
Error using solution>myFcn
Invalid argument at position 1. Value must be of type cell or be convertible to cell.
function myFcn(in)
arguments
in (1,2) cell
end
% do stuff
end
  1 commentaire
Bill Tubbs
Bill Tubbs le 6 Juin 2022
Modifié(e) : Bill Tubbs le 6 Juin 2022
This worked! I just did this:
classdef MKFObserver < matlab.mixin.Copyable
properties
A cell
B cell
%...etc
% Test:
>> MKFObserver([0.7 0.9], ...)
Error setting property 'A' of class 'MKFObserver':
Invalid data type. Value must be cell or be convertible to cell
It doesn't check the underlying type of the elements of the cell array but I decided in the end I don't want this level of validation. Thanks.

Connectez-vous pour commenter.

Plus de réponses (2)

Matt J
Matt J le 4 Juin 2022
Modifié(e) : Matt J le 4 Juin 2022
There is always iscell():
classdef
...
methods
function obj=set.A(obj,A)
assert(iscell(A),'Value assigned to A must be cell array');
obj.A=A;
end
end
end

Sean de Wolski
Sean de Wolski le 5 Juin 2022
Modifié(e) : Sean de Wolski le 5 Juin 2022
I think you'll have to write your own. Must be underlying type is for distributed, gpuArrays and others that masquerade as the underlying type.
mustBeUnderlyingType({pi},'double')
Value must have underlying type 'double'.
You could probably get away with this as your validator: cellfun(@(x)mustBeA(x, 'double'),PropertyName)
c = {pi,magic(3)}
d = {pi, "hello"}
cellfun(@(x)mustBeA(x, 'double'),c)
cellfun(@(x)mustBeA(x, 'double'),d)

Catégories

En savoir plus sur Argument Definitions dans Help Center et File Exchange

Produits


Version

R2019b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by