?? power.m
字號:
function y = power(x,d)
%POWER (overloaded)
% Author Johan L鰂berg
% $Id: power.m,v 1.6 2005/07/19 13:57:39 joloef Exp $
% Sanity check
if prod(size(d))>1
if size(d)~=size(x)
error('Matrix dimensions must agree.');
end
else
d = ones(x.n,x.m)*d;
end
% Trivial cases
if all(all(d==0))
if x.n~=x.m
error('Matrix must be square.')
end
y = eye(x.n,x.m).^0;
return
end
if all(all(d==1))
y = x;
return
end
% Fractional, negative or different powers are
% treated less efficiently using simple code.
fractional = any(any((ceil(d)-d>0)));
negative = any(any(d<0));
different = ~all(all(d==d(1)));
if fractional | negative | different
if x.n>1 | x.m>1
[n,m] = size(x);
y = [];
for i = 1:n % FIX : Vectorize!
temp = [];
for j = 1:m
temp = [temp ihatethis(x,i,j).^d(i,j)];
end
y = [y;temp];
end
return
else
base = getbase(x);
if isequal(base,[0 1])
mt = yalmip('monomtable');
var = getvariables(x);
previous_var = find((mt(:,var)==d) & (sum(mt~=0,2)==1));
if isempty(previous_var)
mt(end+1,:) = mt(getvariables(x),:)*d;
yalmip('setmonomtable',mt);
y = recover(size(mt,1));
else
y = recover(previous_var);
end
else
error('Only unit scalars can have negative or non-integer powers.');
end
end
return
end
% Back to scalar power...
d = d(1,1);
if x.n>1 | x.m>1
switch d
case 0
y = 1;
case 1
y = x;
otherwise
y = x.*power(x,d-1);
end
else
base = getbase(x);
if isequal(base,[0 1])
mt = yalmip('monomtable');
var = getvariables(x);
previous_var = find((mt(:,var)==d) & (sum(mt~=0,2)==1));
if isempty(previous_var)
mt(end+1,:) = mt(getvariables(x),:)*d;
yalmip('setmonomtable',mt);
y = x;
y.lmi_variables = size(mt,1);
else
y = x;
y.lmi_variables = previous_var;
end
else
switch d
case 0
y = 1;
case 1
y = x;
otherwise
y = x.*power(x,d-1);
end
end
end
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -