MATLAB Answers

Classdef get methods: allowing get indexing into an array of length either (1x1) or (Nx1).

6 ビュー (過去 30 日間)
D. Plotnick
D. Plotnick 2019 年 3 月 27 日
コメント済み: D. Plotnick 2019 年 3 月 28 日
Hello all, I am trying to sort out an issue best shown in this MWE, where I have a property that may be a column vector, but is initialized with a single value.
classdef myClass
properties
A (:,1) double = 0;
end
methods
end
end
Now, lets say I want to index into myClass.A using B = myClass.A(indx). However, I want it so that if myClass.A is still a (1x1) I want to return the initial value, not an "Index exceeds array bounds" error.
I can picture doing this with a get method of the following form
function out = get.A(indx)
if numel(obj.A) == 1
out = obj.A(1);
else
out = obj.A(indx);
end
end
However, this will clearly not work since (A) get methods are limitited to one input, and I need to pass "indx", (B) I don't pass an instance of the object to get.A, so it has no access, and (C) this would wind up being infinitely recursive if I was able to do it.
SO:
Is there a way to allow use of a single default value as the output of a property regardless of the requested index, if that property has not yet been overwritten with an Nx1 vector.
Cheers,
DP

  0 件のコメント

サインインしてコメントする。

採用された回答

Catalytic
Catalytic 2019 年 3 月 27 日
編集済み: Catalytic 2019 年 3 月 27 日
You would need to overload subsref, e.g.,
methods
function out=subsref(obj,S)
if S(1).type=="." && S(1).subs{1}=="A" && numel(S)>1
out=obj.A(min(S(2).subs{1},1));
else
error 'Undefined Indexing'
end
end
end

  1 件のコメント

D. Plotnick
D. Plotnick 2019 年 3 月 28 日
Darn. I was hoping someone had another idea in the last day, because I really don't want to overload subsref or any other low level Matlab functions. Thanks for the input, I hadn't even thought of that, I may just need to bite the bullet and put the check:
if indx > length(obj.A)
indx = 1;
end
val = obj.A(indx);
into all of the higher level functions, rather than something in the class definition itself.

サインインしてコメントする。

その他の回答 (1 件)

Sean de Wolski
Sean de Wolski 2019 年 3 月 28 日
編集済み: Sean de Wolski 2019 年 3 月 28 日
You could GetAccess Protect the A property and then use a method instead of straight property reference.
methods
function a = getA(obj, indx)
if numel(obj.A) == 1 || nargin == 1
out = obj.A(1);
else
out = obj.A(indx);
end
end
end

  1 件のコメント

D. Plotnick
D. Plotnick 2019 年 3 月 28 日
Thanks. That is indeed less invasive than overloading subsref.

サインインしてコメントする。

Community Treasure Hunt

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

Start Hunting!

Translated by