-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmxarray.m
More file actions
110 lines (94 loc) · 2.48 KB
/
mxarray.m
File metadata and controls
110 lines (94 loc) · 2.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
classdef mxarray < double
methods
function obj = mxarray(data, type)
obj = obj@double(data);
if ndims(obj) == 2 && all(size(obj) ~= 1)
obj = shiftdim(obj, -2);
elseif ndims(obj) == 3
obj = shiftdim(obj, -1).';
end
if nargin > 1
switch type
case {'r', 'row'}
obj = shiftdim(obj, -1);
case {'c', 'col'}
obj = shiftdim(obj, -1).';
otherwise
error('Type must be one of {''row'', ''col''}.');
end
end
end
function c = subsindex(a)
c = double(a) - 1;
end
function c = plus(a, b)
if isscalar(a) || isscalar(b)
c = mxarray(double(a) + double(b));
else
c = mxarray(mdbasicop(double(a), double(b), '+'));
end
end
function c = minus(a, b)
if isscalar(a) || isscalar(b)
c = mxarray(double(a) - double(b));
else
c = mxarray(mdbasicop(double(a), double(b), '-'));
end
end
function c = times(a, b)
if isscalar(a) || isscalar(b)
c = mxarray(double(a).*double(b));
else
c = mxarray(mdbasicop(double(a), double(b), '*'));
end
end
function c = rdivide(a, b)
if isscalar(a) || isscalar(b)
c = mxarray(double(a)./double(b));
else
c = mxarray(mdbasicop(double(a), double(b), '/'));
end
end
function c = mtimes(a, b)
if isscalar(a) || isscalar(b)
c = mxarray(double(a)*double(b));
elseif size(a, 1)*size(a, 2) == 1 || size(b, 1)*size(b, 2) == 1
c = a.*b;
else
c = mxarray(mdmtimes(double(a), double(b)));
end
end
function c = det(a)
c = mxarray(mddet(double(a)));
end
function c = inv(a)
c = mxarray(mdinv(double(a)));
end
function [v, d] = eig(a)
if any(~isfinite(a))
error('Input to EIG must not contain NaN or Inf.');
elseif nargout > 1
[v, d] = mdeig(double(a));
v = mxarray(v);
d = mxarray(d);
else
v = mxarray(mdeig(double(a)));
end
end
function c = ldivide(a, b)
c = b./a;
end
function c = mldivide(a, b)
c = inv(a)*b; %#ok<*MINV>
end
function c = mrdivide(a, b)
c = a*inv(b);
end
function c = transpose(a)
c = mxarray(permute(a, [2 1 3:ndims(a)]));
end
function c = ctranspose(a)
c = mxarray(conj(a.'));
end
end
end