更改数组中的索引和顺序

时间:2013-05-24 14:33:04

标签: arrays matlab struct indexing

我有一个结构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。只有一个3类型的元素,没有其他类型(4 / 5等)。

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

3:更改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

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

也可以更新to的{​​{1}},from列上的数字。

然而,我无法找到一种非混乱的方法来回溯我的步伐。我可以使用一些简单的命令更新编号吗?

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

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

mpc.branch

编辑#2 :事物的顺序:

  1. 重新订购并重新编号。

  2. bus = mpc.bus; branch = mpc.branch; bus的列(3:结尾)已更改。 (不是这个问题的一部分)

  3. 恢复原始订单和索引。

  4. 谢谢!

1 个答案:

答案 0 :(得分: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_1mpc_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,这次将第一列作为参考来恢复原始格式。