I want to write a class which defines subsasgn. The class holds a numeric value val and the subsasgn should target val only.
I wrote the following test:
function [] = test() num = 1000; a = randi([0 255],[1000 num]); b = Subsasgntest(randi([0 255],[1000 num])); c = randi([0 255],[1 num]); tic; for i = 1:length(c) a(2,i) = c(i); end toc tic; for i = 1:length(c) b(3,i) = c(i); end toc b = b.setKind(1); tic; for i = 1:length(c) b(4,i) = c(i); end tocend
classdef Subsasgntest properties val kind = 0; end methods function obj = Subsasgntest(in) obj.val = in; end function obj = setKind(obj,kind) obj.kind = kind; end function obj = subsasgn(obj,sub,varargin) %SUBSASGN Subscripted assignment
if(isequal(sub.type,'()')) if isequal(obj,[]) error('Not yet implemented!'); end if(isa(varargin{1},'Subsasgntest')) switch obj.kind case 0 obj.val = builtin('subsasgn',obj.val,sub,varargin{1}.val); case 1 obj.val = subsasgn(obj.val,sub,varargin{1}.val); end else switch obj.kind case 0 obj.val = builtin('subsasgn',obj.val,sub,varargin{1}); case 1 obj.val = subsasgn(obj.val,sub,varargin{1}); end end else error('This is not supported for this class!'); end end endend
Results are;
Elapsed time is 0.000019 seconds.Elapsed time is 4.477900 seconds.Elapsed time is 4.449843 seconds.
I know self-written subsasgn can be slow, but 235680x slower? Is there any way to achieve a similar level of optimization as in matlabs standard subsasgn?
This guide tells how to branch for different input subscripts, but not how to write the subsasgn syntx itself: https://www.mathworks.com/help/matlab/matlab_oop/code-patterns-for-subsref-and-subsasgn-methods.html
Best Answer