⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 power.m

📁 国外专家做的求解LMI鲁棒控制的工具箱,可以相对高效的解决LMI问题
💻 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 + -