2013-05-24 1 views
1

배열의 순서 :변경 인덱스 나는 다음과 같은 구조의 구조체 <code>mpc</code>이

  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 : 1

3에서 시작 번호 (mpc.bus의 1 열에 연속을 확인하십시오.받는 사람-에서 mpc.bus의 새로운 번호에 ​​해당하는 mpc.branch의 열,

의 숫자를 변경

4 : 시뮬레이션을 실행 한 후, 같은 순서로 상기와 같이 번호와 설정하는 위의 단계를 역

find를 사용하여 mpc.bus를 업데이트하기 쉽습니다

..
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, from 열의 숫자를 mpc.branch으로 업데이트해도됩니다.

그러나 나는 걷잡을 수없는 방법으로 내 발걸음을 되돌릴 수 없습니다. 몇 가지 간단한 명령을 사용하여 번호 매기기를 업데이트 할 수 있습니까?

기록 : mpc.branch의 번호를 다시 매기는 코드를 의도적으로 포함하지 않았습니다. 누군가가 똑똑하고 간단한 솔루션을 가지고 있기 때문에 (시뮬레이션이 끝나면 다시 실행하기가 더 쉬울 것입니다).

편집 : (구조체와 woriking 피하기 위해) 정상 배열을 생성하는 것이 더 쉬울 수 있습니다

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

편집 # 2 : 일의 순서 :

  1. 다시 - 순서와 재 번호.

  2. busbranch의 열 (3 : 끝)이 변경됩니다. (이 질문에 포함되지 않음)

  3. 원래의 순서와 색인을 복원하십시오.

고마워요!

답변

1

나는이 해결책을 제안하고있다.그대로

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; 

최소 예컨대 위에서 실행될 수 nmpc.bus의 행수 및 mpc.branch 일시적 복사본에 대응하는 곳은 n x 2 행렬을 생성한다. 세 가지 출력 (mpc_1, mpc_2 & mpc_3)은 코드의 작동을 보여주기 위해 마련되었지만 다른 방법으로는 필요하지 않습니다.

1) mpc.bussortrows으로 정렬되어 접근 방식을 간소화하고 find을 세 번 사용하지 않습니다. mpc.bus의 두 번째 열을 대상으로 나머지 행렬을 적절하게 정렬합니다.
2. 원래 내용은 mpc.branch입니다.
3. 루프는 mpc.bus의 첫 번째 열의 항목을 오름차순 숫자로 바꾸는 동시에 사용되며, 동시에 mpc.branch으로 바뀝니다. 여기서는 mpc_tmp에 대한 참조가 필요하므로 요소를 올바르게 교체해야합니다.
4. 이후에 mpc.branch은 (3)과 비슷하게 되돌릴 수 있습니다. 원래 mpc.branch이 저장되어 있던 경우 매트릭스를 복사 할 수 있다고 주장 할 수 있습니다. 또한 원래 값 mpc.bus이 다시 할당됩니다.
5.) 이제 에 sortrows이 다시 적용됩니다. 이번에는 첫 번째 열을 참조로 사용하여 원래 형식으로 복원하십시오.

+0

감사합니다. 나는 이것이 효과가있을 것이라고 생각한다! 'sortrows '대신에'find'를 사용하는 이유는 실제로 배열하기 때문에'2 1 3'이 아니라'1 2 3' (그 부분은 쉽게 고칠 수 있습니다) 때문입니다. 루프를 피하기를 바랬지 만,이 경우에는 어려울 것이라고 생각합니다. 다시 한 번 감사드립니다. (영리한 "빠른 수정"이있는 경우를 대비하여 조금 더 열어 두겠습니다. 내일 답장을 수락하겠습니다.)) –

+0

@ 잭 : 덜 루프/루프 - 무료 아이디어와 함께 올라 오면, 내 대답을 편집합니다. – Schorsch

관련 문제