diff --git a/+misc/Backstepping.m b/+misc/Backstepping.m index 8696516168621d048f7f58b617e6cc2ac83d1a8b..8cad2dee311ed7aa2df24f3b2842270385560e4c 100644 --- a/+misc/Backstepping.m +++ b/+misc/Backstepping.m @@ -136,16 +136,16 @@ classdef Backstepping < handle & matlab.mixin.Copyable % init data if ~isempty(obj.kernel) && isempty(obj.kernelInverse) knownKernelWithSign = obj.signOfIntegralTerm * obj.kernel; - newKernelName = [obj.kernel(1).name, '_{I}']; + newKernelName = obj.kernel(1).name + "_{I}"; elseif isempty(obj.kernel) && ~isempty(obj.kernelInverse) knownKernelWithSign = obj.signOfIntegralTermInverse * obj.kernelInverse; - newKernelName = strrep(obj.kernelInverse(1).name, '_{I}', ''); - newKernelName = strrep(newKernelName, '_I', ''); + newKernelName = strrep(obj.kernelInverse(1).name, "_{I}", ""); + newKernelName = strrep(newKernelName, "_I", ""); else myError = verifyInversion(obj); - error('both kernels are already known'); + error("both kernels are already known"); end newKernel = quantity.Discrete(knownKernelWithSign); @@ -158,8 +158,9 @@ classdef Backstepping < handle & matlab.mixin.Copyable end % successive approximation - progress = misc.ProgressBar('name', ['Successive Calculation of inverse ', ... - 'of ', knownKernelWithSign(1).name, ': '], ... + progress = misc.ProgressBar('name', ... + "Successive Calculation of inverse " + ... + "of " + knownKernelWithSign(1).name + ": ", ... 'steps', 50, 'terminalValue', 50, 'printAbsolutProgress', true); progress.start(); for it = 1 : progress.steps @@ -231,15 +232,18 @@ classdef Backstepping < handle & matlab.mixin.Copyable 'grid must be homogenious'); % calculate gradient numerically + quantityDomain = [quantity.Domain("z", myGrid), quantity.Domain("zeta", myGrid)]; [K_dzetaMat, K_dzMat] = numeric.gradient_on_2d_triangular_domain(... - thisKernel.on({myGrid, myGrid}, {'z', 'zeta'}), spacing, domain); + thisKernel.on(quantityDomain ), spacing, domain); % create quantities as output parameters - K_dzeta = quantity.Discrete(K_dzetaMat, 'grid', {myGrid, myGrid}, ... - 'gridName', {'z', 'zeta'}, 'name', ['d_{zeta}', thisKernel(1).name]); + K_dzeta = quantity.Discrete(K_dzetaMat, ... + 'domain', quantityDomain , ... + 'name', "d_{zeta}" + thisKernel(1).name); - K_dz = quantity.Discrete(K_dzMat, 'grid', {myGrid, myGrid}, ... - 'gridName', {'z', 'zeta'}, 'name', ['d_{z}', thisKernel(1).name]); + K_dz = quantity.Discrete(K_dzMat, ... + 'domain', quantityDomain , ... + 'name', "d_z" + thisKernel(1).name); end % gradient() function domainSelector = get.domainSelector(obj) diff --git a/+misc/ProgressBar.m b/+misc/ProgressBar.m index 01cbb14febb88ca05769bf98ee7c9ac2479fd454..296e979dcd741f3f141c62fc5a7901105e7a3bcc 100644 --- a/+misc/ProgressBar.m +++ b/+misc/ProgressBar.m @@ -42,7 +42,7 @@ classdef ProgressBar < handle properties % Name of the procedure for which the progress should be shown. % This is the text that is shown in front of the progress value. - name = '...'; + name (1, 1) string = "..."; % Current progress state of the procedure as absolute value. progress = 0; @@ -154,7 +154,7 @@ classdef ProgressBar < handle end elseif ~obj.silent obj.reversemsg = ''; - fprintf([obj.name ' ']); + fprintf(obj(1).name + " "); obj.show(); end end diff --git a/+misc/isequalF.m b/+misc/isequalF.m index 546d22120139471e18cee0e77333995f2d120ff3..f26478b48492501f6cdc28a7cfea84e401c3dfdd 100644 --- a/+misc/isequalF.m +++ b/+misc/isequalF.m @@ -25,6 +25,8 @@ if isobject(a) && isobject(b) result = true; elseif ~isequal(size(a), size(b)) result = false; + elseif isstring(a) && ~all(isequal(a, b)) + result = false; else props = union(properties(a), properties(b)); for jt = 1:length(props) diff --git a/+quantity/Discrete.m b/+quantity/Discrete.m index 42e710e13833256f51a1b7f4072457fc9823398c..ee994fb7ea15e88232d93ccfd24e24491c294613 100644 --- a/+quantity/Discrete.m +++ b/+quantity/Discrete.m @@ -15,7 +15,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... figureID double = 1; % Name of this object - name char; + name (1,1) string; % domain domain; @@ -131,7 +131,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... %% set further properties [obj.domain] = deal(myDomain); - [obj.name] = deal(myParser.Results.name); + obj.setName(myParser.Results.name); [obj.figureID] = deal(myParser.Results.figureID); %% reshape object from vector to matrix @@ -187,7 +187,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... headers = cell(1, numel(obj) + 1); headers{1} = obj(1).gridName{1}; for i= 1:numel(obj) %TODO use easier to read headers - headers{i+1} = [obj(i).name '' num2str(i)]; + headers{i+1} = obj(i).name + "" + num2str(i); end exportData = export.dd(... 'M', [obj.grid{:}, obj.valueDiscrete], ... @@ -230,6 +230,10 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... function obj = setName(obj, newName) % Function to set all names of all elements of the quantity obj to newName. +% if ischar(newName) +% warning("Depricated: use string and not char for name-property!") +% newName = string(newName); +% end [obj.name] = deal(newName); end % setName() end @@ -333,7 +337,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... % *) build a new valueDiscrete on the correct grid. obj_hat = quantity.Discrete( newValues, ... - 'name', [obj.name '°' g.name], ... + 'name', obj.name + "°" + g.name, ... 'size', size(obj), ... 'domain', tmpDomain.join); @@ -769,7 +773,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... % solution(it) = objInverseTemp.on(rhs(it)); % end % solution = reshape(solution, size(obj)); - end + end % solveAlgebraic() function inverse = invert(obj, gridName) % inverse solves the function representet by the quantity for @@ -787,10 +791,10 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... assert(numel(obj(1).gridName) == 1); assert(isequal(size(obj), [1, 1])); inverse = quantity.Discrete(repmat(obj(1).grid{obj(1).domain.gridIndex(gridName)}(:), [1, size(obj)]), ... - 'size', size(obj), 'domain', quantity.Domain([obj(1).name], obj.on()), ... + 'size', size(obj), ... + 'domain', quantity.Domain([obj(1).name], obj.on()), ... 'name', gridName); - - end + end % invert() function solution = solveDVariableEqualQuantity(obj, varargin) % solves the first order ODE @@ -856,7 +860,8 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... reshape(odeSolution, [myGridSize, size(obj)]), ... 'domain', [quantity.Domain(myParser.Results.newGridName, variableGrid), ... quantity.Domain('ic', myParser.Results.initialValueGrid)], ... - 'size', size(obj), 'name', ['solve(', obj(1).name, ')']); + 'size', size(obj), ... + 'name', "solve(" + obj(1).name + ")"); end % solveDVariableEqualQuantity() function solution = subs(obj, gridName2Replace, values) @@ -913,7 +918,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... % replaced. If there are more cell-elements in those inputs % then subs() is called again for the remaining pairs % (gridName2Replace{2:end}, values{2:end}). - if ischar(values{1}) + if ischar(values{1}) || isstring(values{1}) % if values{1} is a char-array, then the gridName is % replaced if any(strcmp(values{1}, gridName2Replace(2:end))) @@ -971,7 +976,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... % the resulting quantity looses that spatial grid and % gridName newDomain = obj(1).domain; - newDomain = newDomain(~strcmp({newDomain.name}, gridName2Replace{1})); + newDomain = newDomain(~strcmp(gridName2Replace{1}, [newDomain.name])); % newGrid is the similar to the original grid, but the % grid of gridName2Replace is removed. newGridSize = newDomain.gridLength(); @@ -1281,8 +1286,8 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... bMat = flip(bMat, gridIdx(it)); end b = quantity.Discrete(bMat, ... - 'grid', a(1).grid, 'gridName', a(1).gridName, ... - 'name', ['flip(', a(1).name, ')']); + 'domain', a(1).domain, ... + 'name', "flip(" + a(1).name + ")"); end % flipGrid() function newObj = changeGrid(obj, gridNew, gridNameNew) @@ -1421,16 +1426,16 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... function s = sum(obj, dim) s = quantity.Discrete(sum(obj.on(), obj.nargin + dim), ... - 'grid', obj(1).grid, 'gridName', obj(1).gridName, ... - 'name', ['sum(', obj(1).name, ')']); - end + 'domain', obj(1).domain, ... + 'name', "sum(" + obj(1).name + ")"); + end % sum() function y = sqrt(x) % quadratic root for scalar and diagonal quantities y = quantity.Discrete(sqrt(x.on()), ... - 'size', size(x), 'grid', x(1).grid, 'gridName', x(1).gridName, ... - 'name', ['sqrt(', x(1).name, ')']); - end + 'size', size(x), 'domain', x(1).domain, ... + 'name', "sqrt(" + x(1).name + ")"); + end % sqrt() function y = sqrtm(x) @@ -1450,12 +1455,12 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... yUnmuted(:,:,k) = sqrt(xPermuted(:,:,k)); end y = quantity.Discrete(permute(yUnmuted, permuteBack), ... - 'size', size(x), 'grid', x(1).grid, 'gridName', x(1).gridName, ... - 'name', ['sqrt(', x(1).name, ')']); + 'size', size(x), 'domain', x(1).domain, ... + 'name', "sqrtm(" + x(1).name + ")"); else error('sqrtm() is only implemented for quadratic matrices'); end - end + end % sqrtm() function P = mpower(a, p) % a^p implemented by multiplication @@ -1464,10 +1469,11 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... for k = 1:(p-1) P = P * a; end - end + end % mpower() function s = num2str(obj) s = obj.name; - end + end % num2str() + function P = mtimes(a, b) % TODO rewrite the selection of the special cases! the % if-then-cosntruct is pretty ugly! @@ -1487,12 +1493,12 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... if numel(b) == 1 % simple multiplication in scalar case P = quantity.Discrete(a.on() * b, 'size', size(a),... - 'grid', a(1).grid, 'gridName', a(1).gridName, ... - 'name', [a(1).name, num2str(b)]); + 'domain', a(1).domain, ... + 'name', a(1).name + num2str(b)); return else - b = quantity.Discrete(b, 'size', size(b), 'grid', {}, ... - 'gridName', {}, 'name', ''); + b = quantity.Discrete(b, 'size', size(b), ... + 'domain', quantity.Domain.empty()); end end @@ -1504,7 +1510,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... if isnumeric(P) return else - P.setName(['c ', b(1).name]); + P.setName("c " + b(1).name); return end end @@ -1515,7 +1521,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... % instead. Thus we have to exchange both tranposed values % transpose the result in the end. P = (b' * a')'; - P.setName([a(1).name, ' ', b(1).name]); + P.setName(a(1).name + " " + b(1).name); return elseif a.isConstant() && b.isConstant() P = a.on() * b.on(); @@ -1551,7 +1557,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... % multiple dimensions of the input are correctly arranged. [idx, permuteGrid] = computePermutationVectors(a, b); - parameters.name = [a(1).name, ' ', b(1).name]; + parameters.name = a(1).name + " " + b(1).name; parameters.figureID = a(1).figureID; domainA = a(1).domain; @@ -1610,7 +1616,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... % use ./ for scalar case y = quantity.Discrete(1 ./ objDiscreteOriginal, ... 'domain', obj(1).domain, ... - 'name', ['(', obj(1).name, ')^{-1}']); + 'name', "(" + obj(1).name + ")^{-1}"); else % reshape and permute objDiscrete such that only on for % loop is needed. @@ -1624,27 +1630,28 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... y = quantity.Discrete(reshape(invDiscrete, size(objDiscreteOriginal)),... 'domain', obj(1).domain, ... - 'name', ['{(', obj(1).name, ')}^{-1}']); + 'name', "{(" + obj(1).name + ")}^{-1}"); end end % inv() function objT = transpose(obj) objT = builtin('transpose', copy(obj)); - [objT.name] = deal(['{', obj(1).name, '}^{T}']); + objT.setName("{" + obj(1).name + "}^{T}"); end % transpose(obj) function objCt = ctranspose(obj) objT = obj.'; objCtMat = conj(objT.on()); - objCt = quantity.Discrete(objCtMat, 'grid', obj(1).grid, ... - 'gridName', obj(1).gridName, 'name', ['{', obj(1).name, '}^{H}']); + objCt = quantity.Discrete(objCtMat, ... + 'domain', obj(1).domain, ... + 'name', "{" + obj(1).name + "}^{H}"); end % ctranspose(obj) function y = exp(obj) % exp() is the exponential function using obj as the exponent. y = quantity.Discrete(exp(obj.on()), ... - 'name', ['exp(', obj(1).name, ')'], ... - 'grid', obj(1).grid, 'gridName', obj(1).gridName, ... + 'domain', obj(1).domain, ... + 'name', "exp(" + obj(1).name + ")", ... 'size', size(obj)); end % exp() @@ -1667,7 +1674,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... else xNorm = sqrtm( int(obj.' * optArg.weight * obj, integralGridName) ); if isa(xNorm, 'quantity.Discrete') - xNorm = xNorm.setName(['||', obj(1).name, '||_{L2}']); + xNorm = xNorm.setName("||" + obj(1).name + "||_{L2}"); end end end % l2norm() @@ -1682,7 +1689,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... myParser.addParameter('weight', eye(size(obj, 1))); myParser.parse(varargin{:}); xNorm = sqrtm(obj.' * myParser.Results.weight * obj); - xNorm.setName(['||', obj(1).name, '||_{2}']); + xNorm.setName("||" + obj(1).name + "||_{2}"); end % quadraticNorm() function y = expm(x) @@ -1703,8 +1710,8 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... yUnmuted(:,:,k) = expm(xPermuted(:,:,k)); end y = quantity.Discrete(permute(yUnmuted, permuteBack), ... - 'size', size(x), 'grid', x(1).grid, 'gridName', x(1).gridName, ... - 'name', ['expm(', x(1).name, ')']); + 'size', size(x), 'domain', x(1).domain, ... + 'name', "expm(" + x(1).name + ")"); end end @@ -1725,7 +1732,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... function x = rdivide(A, B) if isnumeric(A) x = quantity.Discrete( A ./ B.on(), 'size', size(B), ... - 'domain', B(1).domain, 'name', ['1 ./ ' B(1).name]); + 'domain', B(1).domain, 'name', "1 ./ " + B(1).name); else error('Not yet implemented') end @@ -1932,9 +1939,9 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... myParser = misc.Parser; myParser.addRequired('domain', @(d) obj(1).domain.gridIndex(d) ~= 0); myParser.addRequired('lowerBound', ... - @(l) isnumeric(l) || ischar(l) ); + @(l) isnumeric(l) || ischar(l) || isstring(l)); myParser.addRequired('upperBound', ... - @(l) isnumeric(l) || ischar(l) ); + @(l) isnumeric(l) || ischar(l) || isstring(l)); myParser.parse(domain, lowerBound, upperBound) % get grid @@ -1944,15 +1951,14 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... % integrate F = numeric.cumtrapz_fast_nDim(myGrid{intGridIdx}, ... obj.on(), intGridIdx); - result = quantity.Discrete(F, 'grid', myGrid, ... - 'gridName', obj(1).gridName); + result = quantity.Discrete(F, 'domain', obj(1).domain); % int_lowerBound^upperBound f(.) = % F(upperBound) - F(lowerBound) - result = result.subs( {domain}, upperBound) ... - - result.subs({domain}, lowerBound); + result = result.subs(domain, upperBound) ... + - result.subs(domain, lowerBound); if isa(result, 'quantity.Discrete') - result.setName(deal(['int(', obj(1).name, ')'])); + result.setName("int(" + obj(1).name + ")"); end end @@ -1968,15 +1974,15 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... % for support of numeric inputs: if ~isa(A, 'quantity.Discrete') if isnumeric(A) - A = quantity.Discrete(A, 'name', 'c', 'domain', quantity.Domain.empty()); + A = quantity.Discrete(A, 'name', "c", 'domain', quantity.Domain.empty()); else error('Not yet implemented') end elseif ~isa(B, 'quantity.Discrete') if isnumeric(B) - B = quantity.Discrete(B, 'name', 'c', 'domain', quantity.Domain.empty()); + B = quantity.Discrete(B, 'name', "c", 'domain', quantity.Domain.empty()); else - B = quantity.Discrete(B, 'name', 'c', 'gridName', A(1).gridName, 'grid', A.grid); + B = quantity.Discrete(B, 'name', "c", 'domain', A(1).domain); end end @@ -1989,19 +1995,19 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... % create result object C = quantity.Discrete(aDiscrete + bDiscrete, ... 'domain', joinedDomain, ... - 'name', [A(1).name, '+', B(1).name]); + 'name', A(1).name + "+" + B(1).name); end function C = minus(A, B) % minus uses plus() C = A + (-B); if isnumeric(A) - [C.name] = deal(['c-', B(1).name]); + [C.name] = deal("c-" + B(1).name); elseif isnumeric(B) - [C.name] = deal([A(1).name, '-c']); + [C.name] = deal(A(1).name + "-c"); else - [C.name] = deal([A(1).name, '-', B(1).name]); + [C.name] = deal(A(1).name + "-" + B(1).name); end end @@ -2014,7 +2020,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... function C = uminus(A) % unitary plus: C = -A C = (-1) * A; - [C.name] = deal(['-', A(1).name]); + [C.name] = deal("-" + A(1).name); end function [P, supremum] = relativeErrorSupremum(A, B) @@ -2091,23 +2097,23 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... else absQuantity = quantity.Discrete(abs(obj.on()), ... 'domain', obj(1).domain, ... - 'size', size(obj), 'name', ['|', obj(1).name, '|']); + 'size', size(obj), 'name', "|" + obj(1).name + "|"); end end % abs() function y = real(obj) % real() returns the real part of the obj. y = quantity.Discrete(real(obj.on()), ... - 'name', ['real(', obj(1).name, ')'], ... - 'grid', obj(1).grid, 'gridName', obj(1).gridName, ... + 'name', "real(" + obj(1).name + ")", ... + 'domain', obj(1).domain, ... 'size', size(obj)); end % real() function y = imag(obj) % real() returns the imaginary part of the obj. y = quantity.Discrete(imag(obj.on()), ... - 'name', ['imag(', obj(1).name, ')'], ... - 'grid', obj(1).grid, 'gridName', obj(1).gridName, ... + 'name', "imag(" + obj(1).name + ")", ... + 'domain', obj(1).domain, ... 'size', size(obj)); end % imag() @@ -2270,7 +2276,7 @@ classdef (InferiorClasses = {?quantity.Symbolic}) Discrete ... gridJoinedLength = newDomain.gridLength; % get the index of obj.grid in the joined grid - [idx, logicalIdx] = newDomain.gridIndex({obj(1).domain.name}); + [idx, logicalIdx] = newDomain.gridIndex([obj(1).domain.name]); % evaluate the valDiscrete = obj.on( newDomain(logicalIdx) ); oldDim = ndims(valDiscrete); diff --git a/+quantity/Function.m b/+quantity/Function.m index 78f2713607534bd15f65483f2eaeecaea666eaa0..8b1a4e2d7b38d1c8728233af26c46ea4ad42770e 100644 --- a/+quantity/Function.m +++ b/+quantity/Function.m @@ -115,7 +115,7 @@ classdef Function < quantity.Discrete mObj(k).valueDiscrete = - obj(k).valueDiscrete; end - [mObj.name] = deal(['-' obj.name]); + mObj.setName("-" + obj(1).name); end function p = inner(A, B) diff --git a/+quantity/Symbolic.m b/+quantity/Symbolic.m index 5d501c19775d564659aa4e768ddbf0e577fcf987..0d6a493d7d26f5bf7dadbfc3a94d16511f60e6bc 100644 --- a/+quantity/Symbolic.m +++ b/+quantity/Symbolic.m @@ -178,13 +178,11 @@ classdef Symbolic < quantity.Function % Cast of a quantity.Symbolic object into a quantity.Discrete % object. myParser = misc.Parser(); - myParser.addParameter('grid', obj(1).grid); - myParser.addParameter('gridName', obj(1).gridName); + myParser.addParameter('domain', obj(1).domain); myParser.addParameter('name', obj(1).name); myParser.parse(varargin{:}); - assert(isequal(myParser.Results.gridName, obj(1).gridName)) Q = quantity.Discrete(obj.on(), ... - 'grid', myParser.Results.grid, 'gridName', myParser.Results.gridName, ... + 'domain', myParser.Results.domain, ... 'name', myParser.Results.name); end function f = function_handle(obj) @@ -192,15 +190,12 @@ classdef Symbolic < quantity.Function end function F = quantity.Function(obj, varargin) myParser = misc.Parser(); - myParser.addParameter('grid', obj(1).grid); - myParser.addParameter('gridName', obj(1).gridName); + myParser.addParameter('domain', obj(1).domain); myParser.addParameter('name', obj(1).name); myParser.parse(varargin{:}); - assert(isequal(myParser.Results.gridName, obj(1).gridName)) for k = 1:numel(obj) F(k) = quantity.Function(obj(k).function_handle(), ... - 'grid', myParser.Results.grid, ... - 'gridName', myParser.Results.gridName, ... + 'domain', myParser.Results.domain, ... 'name', myParser.Results.name); end @@ -500,7 +495,7 @@ classdef Symbolic < quantity.Function solution = quantity.Symbolic(symbolicSolution, ... 'gridName', {myParser.Results.newGridName, 'ic'}, ... 'grid', {myParser.Results.variableGrid, myParser.Results.initialValueGrid}, ... - 'name', ['solve(', obj(1).name, ')']); + 'name', "solve(" + obj(1).name + ")"); end % solveDVariableEqualQuantity() function sym = sym(obj) @@ -518,14 +513,14 @@ classdef Symbolic < quantity.Function % quadratic root for scalar and diagonal symbolic quantities y = quantity.Symbolic(sqrt(x.sym()), ... 'domain', x(1).domain, ... - 'name', ['sqrt(', x(1).name, ')']); + 'name', "sqrt(" + x(1).name + ")"); end % sqrt() function y = sqrtm(x) % quadratic root for matrices of symbolic quantities y = quantity.Symbolic(sqrtm(x.sym()), ... 'domain', x(1).domain, ... - 'name', ['sqrtm(', x(1).name, ')']); + 'name', "sqrtm(" + x(1).name + ")"); end % sqrtm() function b = flipGrid(a, myGridName) @@ -540,7 +535,7 @@ classdef Symbolic < quantity.Function end b = quantity.Symbolic(subs(a.sym, variableOld, variableNew), ... 'domain', a(1).domain, ... - 'name', ['flip(', a(1).name, ')']); + 'name', "flip(" + a(1).name + ")"); end % flipGrid() function thisVariable = gridName2variable(obj, thisGridName) @@ -569,8 +564,8 @@ classdef Symbolic < quantity.Function function mObj = uminus(obj) % unitary minus: C = -A - mObj = quantity.Symbolic(-obj.sym, 'grid', obj(1).grid, ... - 'domain', obj(1).domain, 'name', ['-', obj(1).name]); + mObj = quantity.Symbolic(-obj.sym, ... + 'domain', obj(1).domain, 'name', "-" + obj(1).name); end % uminus() function mObj = uplus(obj) % unitary plus: C = +A @@ -589,13 +584,13 @@ classdef Symbolic < quantity.Function if isnumeric(B) C = quantity.Symbolic(A.sym() * B, ... 'domain', A(1).domain, ... - 'name', [A(1).name, ' c']); + 'name', A(1).name + " c"); return end if isnumeric(A) C = quantity.Symbolic(A * B.sym(), ... 'domain', B(1).domain, ... - 'name', ['c ', B(1).name]); + 'name', "c " + B(1).name); return end if ~(isa(B, 'quantity.Symbolic')) && isa(B, 'quantity.Function') @@ -604,7 +599,7 @@ classdef Symbolic < quantity.Function end parameters.domain = gridJoin(A(1).domain, B(1).domain); - parameters.name = [A(1).name, ' ', B(1).name]; + parameters.name = A(1).name + " " + B(1).name; parameters = misc.struct2namevaluepair(parameters); C = quantity.Symbolic(A.sym() * B.sym(), parameters{:}); @@ -615,7 +610,7 @@ classdef Symbolic < quantity.Function assert(isequal(size(a), size(b)), 'terms must be of same size'); if ~isa(a, 'quantity.Discrete') if isnumeric(a) - a = quantity.Symbolic(a, 'name', 'c', 'domain', quantity.Domain.empty()); + a = quantity.Symbolic(a, 'name', "c", 'domain', quantity.Domain.empty()); else error('Not yet implemented') end @@ -623,7 +618,7 @@ classdef Symbolic < quantity.Function else if ~isa(b, 'quantity.Discrete') if isnumeric(b) - b = quantity.Symbolic(b, 'name', 'c', 'domain', quantity.Domain.empty()); + b = quantity.Symbolic(b, 'name', "c", 'domain', quantity.Domain.empty()); else error('Not yet implemented') end @@ -640,7 +635,7 @@ classdef Symbolic < quantity.Function % set new parameter values: parameters.domain = gridJoin(a(1).domain, b(1).domain); - parameters.name = [a(1).name, '+' , b(1).name]; + parameters.name = a(1).name + "+" + b(1).name; parameters = misc.struct2namevaluepair(parameters); C = quantity.Symbolic(a.sym() + b.sym(), parameters{:}); @@ -649,21 +644,21 @@ classdef Symbolic < quantity.Function function absQuantity = abs(obj) % abs returns the absolut value of the quantity as a quantity absQuantity = quantity.Symbolic(abs(obj.sym()), ... - 'name', ['|', obj(1).name, '|'], ... + 'name', "|" + obj(1).name + "|", ... 'domain', obj(1).domain); end % abs() function y = real(obj) % real() returns the real part of the obj. y = quantity.Symbolic(real(obj.sym()), ... - 'name', ['real(', obj(1).name, ')'], ... + 'name', "real(" + obj(1).name + ")", ... 'domain', obj(1).domain); end % real() function y = imag(obj) % imag() returns the real part of the obj. y = quantity.Symbolic(imag(obj.sym()), ... - 'name', ['real(', obj(1).name, ')'], ... + 'name', "imag(" + obj(1).name + ")", ... 'domain', obj(1).domain); end % imag() @@ -671,27 +666,27 @@ classdef Symbolic < quantity.Function % inv inverts the matrix obj. y = quantity.Symbolic(inv(obj.sym()), ... 'domain', obj(1).domain, ... - 'name', ['(', obj(1).name, ')^{-1}']); + 'name', "(" + obj(1).name + ")^{-1}"); end % inv() function y = exp(obj) % exp() is the exponential function using obj as the exponent. y = quantity.Symbolic(exp(obj.sym()), ... - 'name', ['exp(', obj(1).name, ')'], ... + 'name', "exp(" + obj(1).name + ")", ... 'domain', obj(1).domain); end % exp() function y = expm(obj) % exp() is the matrix-exponential function using obj as the exponent. y = quantity.Symbolic(expm(obj.sym()), ... - 'name', ['expm(', obj(1).name, ')'], ... + 'name', "expm(" + obj(1).name + ")", ... 'domain', obj(1).domain); end % expm() function y = ctranspose(obj) % ctranspose() or ' is the complex conjugate tranpose y = quantity.Symbolic(conj(obj.sym().'), ... - 'name', ['{', obj(1).name, '}^{H}'], ... + 'name', "{" + obj(1).name + "}^{H}", ... 'domain', obj(1).domain); end % expm() @@ -767,7 +762,7 @@ classdef Symbolic < quantity.Function % is needed. C = quantity.Symbolic(I, ... 'grid', gridI, 'gridName', gridNameI, ... - 'name', ['int[', obj(1).name, ']']); + 'name', "int(" + obj(1).name, ")"); catch C = cumInt(quantity.Discrete(obj), z, a, b); end @@ -797,9 +792,9 @@ classdef Symbolic < quantity.Function myParser = misc.Parser; myParser.addRequired('domain', @(d) obj(1).domain.gridIndex(d) ~= 0); myParser.addRequired('lowerBound', ... - @(l) isnumeric(l) || ischar(l) ); + @(l) isnumeric(l) || ischar(l) || isstring(l) ); myParser.addRequired('upperBound', ... - @(l) isnumeric(l) || ischar(l) ); + @(l) isnumeric(l) || ischar(l) || isstring(l) ); myParser.parse(domain, lowerBound, upperBound) % call int to perform integration diff --git a/+signals/PolynomialOperator.m b/+signals/PolynomialOperator.m index 2cd7ade540893dcf3bbc70c37aef44927033e010..963a6ca329ad8606b542b7799fb7abc5e2523bbc 100644 --- a/+signals/PolynomialOperator.m +++ b/+signals/PolynomialOperator.m @@ -200,7 +200,7 @@ classdef PolynomialOperator < handle & matlab.mixin.Copyable c = cell(1, size(C, 3)); for k = 1:size(C, 3) c{k} = quantity.Discrete(double(C(:,:,k)), ... - 'gridName', {}, 'grid', {}, 'name', ['adj(' A(1).coefficient.name ')']); + 'gridName', {}, 'grid', {}, 'name', "adj(" + A(1).coefficient(1).name + ")"); end C = signals.PolynomialOperator(c); @@ -214,7 +214,8 @@ classdef PolynomialOperator < handle & matlab.mixin.Copyable c = cell(1, size(C, 3)); for k = 1:size(C, 3) c{k} = quantity.Discrete(double(C(:,:,k)), ... - 'gridName', {}, 'grid', {}, 'name', ['det(' A(1).coefficient.name ')']); + 'domain', quantity.Domain.empty(), ... + 'name', "det(" + A(1).coefficient(1).name + ")"); end C = signals.PolynomialOperator(c); diff --git a/+unittests/+quantity/testDiscrete.m b/+unittests/+quantity/testDiscrete.m index 7cbe9f6959f2988c3a2cbd0776b1f5305939eb10..03bd232101a7f06e715752a71f64e0d99e6150cb 100644 --- a/+unittests/+quantity/testDiscrete.m +++ b/+unittests/+quantity/testDiscrete.m @@ -19,11 +19,11 @@ Z = tc.TestData.sym.z; T = tc.TestData.sym.t; ZETA = tc.TestData.sym.zeta; -t = quantity.Domain('t', linspace(0, 2, 101)); -z = quantity.Domain('z', linspace(0, 1, 51)); +t = quantity.Domain("t", linspace(0, 2, 101)); +z = quantity.Domain("z", linspace(0, 1, 51)); x = quantity.Symbolic([Z * T; T], 'domain', [z, t]); -xNorm = sqrt(int(x.' * x, 'z')); +xNorm = sqrt(int(x.' * x, "z")); tc.verifyEqual(MAX(abs(xNorm - x.l2norm('z'))), 0, 'AbsTol', 1e-12); x = quantity.Discrete(x); @@ -124,7 +124,7 @@ zeta = quantity.Domain('zeta', linspace(0, 1, 41)); A = quantity.Discrete(cat(4, ... cat(3, 1 + z.grid .* zeta.grid', - z.ones .* zeta.grid'), ... cat(3, -z.grid .* zeta.ones', z.grid .^2 .* zeta.ones') ), ... - 'domain', [z, zeta], 'name', 'q'); + 'domain', [z, zeta], 'name', "q"); B = 2*A(:, 1); C = 3*A(1); @@ -152,10 +152,10 @@ tc.verifyEqual(ABCB(zeroElements(:)).on(), 0*ABCB(zeroElements(:)).on()); end % testBlkdiag() function testSetName(tc) -blub = quantity.Discrete(ones(11, 2), 'grid', linspace(0, 1, 11), 'gridName', 'z'); -blub.setName('asdf'); -tc.verifyEqual(blub(1).name, 'asdf'); -tc.verifyEqual(blub(2).name, 'asdf'); +blub = quantity.Discrete(ones(11, 2), 'domain', quantity.Domain("z", linspace(0, 1, 11))); +blub.setName("asdf"); +tc.verifyEqual(blub(1).name, "asdf"); +tc.verifyEqual(blub(2).name, "asdf"); end function testCtranspose(tc) @@ -164,7 +164,7 @@ zeta = tc.TestData.sym.zeta; qSymbolic = quantity.Symbolic(... [1+z*zeta, -zeta; -z, z^2], 'grid', {linspace(0, 1, 21), linspace(0, 1, 41)},... - 'gridName', {'z', 'zeta'}, 'name', 'q'); + 'gridName', {'z', 'zeta'}, 'name', "q"); qDiscrete = quantity.Discrete(qSymbolic); qDiscreteCtransp = qDiscrete'; tc.verifyEqual(qDiscrete(1,1).on(), qDiscreteCtransp(1,1).on()); @@ -173,7 +173,7 @@ tc.verifyEqual(qDiscrete(1,2).on(), qDiscreteCtransp(2,1).on()); tc.verifyEqual(qDiscrete(2,1).on(), qDiscreteCtransp(1,2).on()); qDiscrete2 = quantity.Discrete(ones(11, 1) + 2i, ... - 'grid', linspace(0, 1, 11), 'gridName', 'z', 'name', 'im'); + 'grid', linspace(0, 1, 11), 'gridName', "z", 'name', "im"); qDiscrete2Ctransp = qDiscrete2'; tc.verifyEqual(qDiscrete2.real.on(), qDiscrete2Ctransp.real.on()); tc.verifyEqual(qDiscrete2.imag.on(), -qDiscrete2Ctransp.imag.on()); @@ -185,7 +185,7 @@ zeta = tc.TestData.sym.zeta; qSymbolic = quantity.Symbolic(... [1+z*zeta, -zeta; -z, z^2], 'grid', {linspace(0, 1, 21), linspace(0, 1, 41)},... - 'gridName', {'z', 'zeta'}, 'name', 'q'); + 'gridName', {'z', 'zeta'}, 'name', "q"); qDiscrete = quantity.Discrete(qSymbolic); qDiscreteTransp = qDiscrete.'; @@ -354,7 +354,7 @@ end function testSqrt(testCase) % 1 spatial variable quanScalar1d = quantity.Discrete((linspace(0,2).^2).', 'size', [1, 1], 'grid', linspace(0, 1), ... - 'gridName', 'z', 'name', 's1d'); + 'gridName', 'z', 'name', "s1d"); quanScalarRoot = quanScalar1d.sqrt(); testCase.verifyEqual(quanScalarRoot.on(), linspace(0, 2).'); diff --git a/+unittests/+quantity/testFunction.m b/+unittests/+quantity/testFunction.m index 9f7613f4c1912695cbf758e8959cd446f0e684e1..4e375b613fd693f78b89a530a9015f29b1683b6d 100644 --- a/+unittests/+quantity/testFunction.m +++ b/+unittests/+quantity/testFunction.m @@ -133,9 +133,9 @@ end function testInit(testCase) fun = @(z) z.^2; -q = quantity.Function(fun, 'name', 'test'); +q = quantity.Function(fun, 'name', "test"); verifyEqual(testCase, q.valueContinuous, fun); -verifyEqual(testCase, q.name, 'test'); +verifyEqual(testCase, q.name, "test"); end function testDimensions(testCase)