我有一个结构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 :事物的顺序:
重新订购并重新编号。
bus = mpc.bus;
branch = mpc.branch;
和bus
的列(3:结尾)已更改。 (不是这个问题的一部分)
恢复原始订单和索引。
谢谢!
答案 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_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
,这次将第一列作为参考来恢复原始格式。