1

我有一个mpc具有以下结构的结构:

          num  type    col3    col4 ...
mpc.bus =   1     2     ...    ...
            2     2     ...    ...
            3     1     ...    ...
            4     3     ...    ...
            5     1     ...    ...
           10     2     ...    ...
           99     1     ...    ...

             to from   col3   col4 ...
mpc.branch =  1    2    ...    ...
              1    3    ...    ...
              2    4    ...    ... 
             10    5    ...    ...
             10   99    ...    ...

我需要做的是: 1:重新排序 的行mpc.bus,使得所有类型的行都1在前,然后是2,最后是3。只有一个 type 元素3,没有其他类型(4 / 5等)。

2:进行编号(第 1 列mpc.bus,连续,从 1 开始。

3:更改 , 的 to-from 列中的数字mpc.branch以对应 中的新编号mpc.bus

4:运行模拟后,将上述步骤颠倒,以与上述相同的顺序和编号出现。

mpc.bus使用更新很容易find

type_1 = find(mpc.bus(:,2) == 1);
type_2 = find(mpc.bus(:,2) == 2);
type_3 = find(mpc.bus(:,2) == 3);

mpc.bus(:,:) = mpc.bus([type1; type2; type3],:);
mpc.bus(:,1) = 1:nb   % Where nb is the number of rows of mpc.bus

中的 to/from 列中mpc.branch的数字对应于 中的第 1列中的数字mpc.bus

也可以更新to,from列上的数字mpc.branch

但是,我无法找到一种不混乱的方式来追溯我的脚步。我可以使用一些简单的命令更新编号吗?

作为记录:我故意不包括我的代码来重新编号 mpc.branch,因为我确信有人有一个更聪明、更简单的解决方案(这将使模拟完成后更容易重做)。

编辑:创建普通数组可能更容易(以避免使用结构):

bus = mpc.bus;
branch = mpc.branch;

编辑#2:事情的顺序:

  1. 重新排序并重新编号。

  2. bus和的列 (3:end)branch已更改。(不是这个问题的一部分)

  3. 恢复原始顺序和索引。

谢谢!

4

1 回答 1

1

我提出这个解决方案。它生成一个n x 2矩阵,其中n对应于 中的行数mpc.bus和 的临时副本mpc.branch

function [mpc_1, mpc_2, mpc_3] = minimal_example

mpc.bus = [ 1     2;...
            2     2;...
            3     1;...
            4     3;...
            5     1;...
           10     2;...
           99     1];

mpc.branch = [ 1    2;...
               1    3;...
               2    4;...
              10    5;...
              10   99];

mpc.bus = sortrows(mpc.bus,2);

mpc_1 = mpc;

mpc_tmp = mpc.branch;

for I=1:size(mpc.bus,1)
    PAIRS(I,1) = I;
    PAIRS(I,2) = mpc.bus(I,1);
    mpc.branch(mpc_tmp(:,1:2)==mpc.bus(I,1)) = I;
    mpc.bus(I,1) = I;
end

mpc_2 = mpc;
% (a) the following mpc_tmp is only needed if you want to truly reverse the operation
mpc_tmp = mpc.branch; 

%
% do some stuff
%

for I=1:size(mpc.bus,1)
    % (b) you can decide not to use the following line, then comment the line below (a)
    mpc.branch(mpc_tmp(:,1:2)==mpc.bus(I,1)) = PAIRS(I,2);
    mpc.bus(I,1) = PAIRS(I,2);
end

% uncomment the following line, if you commented (a) and (b) above:
% mpc.branch = mpc_tmp;

mpc.bus = sortrows(mpc.bus,1);

mpc_3 = mpc;

上面的最小示例可以按原样执行。三个输出 ( mpc_1, mpc_2& mpc_3) 只是为了演示代码的工作原理,但不是必需的。

1.)mpc.bus使用 排序sortrows,简化方法且不使用find三次。它以第二列为目标mpc.bus并对剩余的矩阵进行相应的排序。
2.)mpc.branch存储原始内容。
3.) 使用循环将 的第一列中的条目替换为mpc.bus升序数字,同时在 中相应地替换它们mpc.branch。在这里,参考mpc_tmp是必要的,因此确保正确替换元素。
4.) 之后,mpc.branch可以与 (3.) 类似地恢复 - 在这里,有人可能会争辩说,如果原件mpc.branch是较早存储的,则可以只复制矩阵。此外, 的原始值mpc.bus被重新分配。
5.) 现在,sortrows再次应用mpc.bus,这次以第一列作为参考以恢复原始格式。

于 2013-05-24T17:34:15.820 回答