E2I_DATA Converts data from external to internal indexing. VAL = E2I_DATA(MPC, VAL, ORDERING) VAL = E2I_DATA(MPC, VAL, ORDERING, DIM) When given a case struct that has already been converted to internal indexing, this function can be used to convert other data structures as well by passing in 2 or 3 extra parameters in addition to the case struct. If the value passed in the 2nd argument is a column vector or cell array, it will be converted according to the ORDERING specified by the 3rd argument (described below). If VAL is an n-dimensional matrix or cell array, then the optional 4th argument (DIM, default = 1) can be used to specify which dimension to reorder. The return value in this case is the value passed in, converted to internal indexing. The 3rd argument, ORDERING, is used to indicate whether the data corresponds to bus-, gen- or branch-ordered data. It can be one of the following three strings: 'bus', 'gen' or 'branch'. For data structures with multiple blocks of data, ordered by bus, gen or branch, they can be converted with a single call by specifying ORDERING as a cell array of strings. Any extra elements, rows, columns, etc. beyond those indicated in ORDERING, are not disturbed. Examples: A_int = e2i_data(mpc, A_ext, {'bus','bus','gen','gen'}, 2); Converts an A matrix for user-supplied OPF constraints from external to internal ordering, where the columns of the A matrix correspond to bus voltage angles, then voltage magnitudes, then generator real power injections and finally generator reactive power injections. gencost_int = e2i_data(mpc, gencost_ext, {'gen','gen'}, 1); Converts a GENCOST matrix that has both real and reactive power costs (in rows 1--ng and ng+1--2*ng, respectively). See also I2E_DATA, E2I_FIELD, EXT2INT.
0001 function newval = e2i_data(mpc, val, ordering, dim) 0002 %E2I_DATA Converts data from external to internal indexing. 0003 % 0004 % VAL = E2I_DATA(MPC, VAL, ORDERING) 0005 % VAL = E2I_DATA(MPC, VAL, ORDERING, DIM) 0006 % 0007 % When given a case struct that has already been converted to 0008 % internal indexing, this function can be used to convert other data 0009 % structures as well by passing in 2 or 3 extra parameters in 0010 % addition to the case struct. If the value passed in the 2nd 0011 % argument is a column vector or cell array, it will be converted 0012 % according to the ORDERING specified by the 3rd argument (described 0013 % below). If VAL is an n-dimensional matrix or cell array, then the 0014 % optional 4th argument (DIM, default = 1) can be used to specify 0015 % which dimension to reorder. The return value in this case is the 0016 % value passed in, converted to internal indexing. 0017 % 0018 % The 3rd argument, ORDERING, is used to indicate whether the data 0019 % corresponds to bus-, gen- or branch-ordered data. It can be one 0020 % of the following three strings: 'bus', 'gen' or 'branch'. For 0021 % data structures with multiple blocks of data, ordered by bus, 0022 % gen or branch, they can be converted with a single call by 0023 % specifying ORDERING as a cell array of strings. 0024 % 0025 % Any extra elements, rows, columns, etc. beyond those indicated 0026 % in ORDERING, are not disturbed. 0027 % 0028 % Examples: 0029 % A_int = e2i_data(mpc, A_ext, {'bus','bus','gen','gen'}, 2); 0030 % 0031 % Converts an A matrix for user-supplied OPF constraints from 0032 % external to internal ordering, where the columns of the A 0033 % matrix correspond to bus voltage angles, then voltage 0034 % magnitudes, then generator real power injections and finally 0035 % generator reactive power injections. 0036 % 0037 % gencost_int = e2i_data(mpc, gencost_ext, {'gen','gen'}, 1); 0038 % 0039 % Converts a GENCOST matrix that has both real and reactive power 0040 % costs (in rows 1--ng and ng+1--2*ng, respectively). 0041 % 0042 % See also I2E_DATA, E2I_FIELD, EXT2INT. 0043 0044 % MATPOWER 0045 % Copyright (c) 2009-2016, Power Systems Engineering Research Center (PSERC) 0046 % by Ray Zimmerman, PSERC Cornell 0047 % 0048 % This file is part of MATPOWER. 0049 % Covered by the 3-clause BSD License (see LICENSE file for details). 0050 % See https://matpower.org for more info. 0051 0052 if ~isfield(mpc, 'order') 0053 error('e2i_data: mpc does not have the ''order'' field required to convert from external to internal numbering.'); 0054 end 0055 o = mpc.order; 0056 if o.state ~= 'i' 0057 error('e2i_data: mpc does not have internal ordering data available, call ext2int first'); 0058 end 0059 if nargin < 4 0060 dim = 1; 0061 end 0062 if ischar(ordering) %% single set 0063 if strcmp(ordering, 'gen') 0064 idx = o.(ordering).status.on(o.(ordering).i2e); 0065 else 0066 idx = o.(ordering).status.on; 0067 end 0068 newval = get_reorder(val, idx, dim); 0069 else %% multiple sets 0070 b = 0; %% base 0071 for k = 1:length(ordering) 0072 n = size(o.ext.(ordering{k}), 1); 0073 v = get_reorder(val, b+(1:n), dim); 0074 new_v{k} = e2i_data(mpc, v, ordering{k}, dim); 0075 b = b + n; 0076 end 0077 n = size(val, dim); 0078 if n > b %% the rest 0079 v = get_reorder(val, b+1:n, dim); 0080 new_v{length(new_v)+1} = v; 0081 end 0082 newval = cat(dim, new_v{:}); 0083 end