2012-01-06 3 views
2

주어진 : 정사각형 행렬 및 제거 할 행의 인덱스를 나타내는 list이며 동시에 제거 할 열의 인덱스를 나타냅니다 정사각형 행렬이므로 하나의 목록 만 필요함).삭제를 사용하여 정사각형 행에서 행과 열을 삭제합니다.

출력 : 목록의 행과 열을 모두 제거한 정사각형 행렬.

유효한 색인 목록을 가정하십시오.

는 예 enter image description here

따라서 상기 두 번째 및 4 번째 행, 또한 제 2 및 제 4 번째 열을 제거하는 말했다이다.

Delete[]을 사용하여 동시에 행과 열을 모두 제거하는 방법을 찾지 못했지만 제거하고 싶은 개별 요소 인덱스의 목록을 만들고 싶지 않았습니다.

그러나 행을 제거하려면 Delete을 사용할 수 있습니다.

이 문제를 해결 한 방법은 다음과 같습니다. 먼저 행을 제거한 다음 행렬을 전 환한 다음 원래 행의 행이 될 새 행렬의 행을 제거한 다음 결과를 다시 변환하여 무엇을 얻었습니까? 나는 원했다. 이 같은

:

a = {{0, 5, 2, 3, 1, 0}, {4, 3, 2, 5, 1, 3}, {4, 1, 3, 5, 3, 2}, {4, 
    4, 1, 1, 1, 5}, {3, 4, 4, 5, 3, 3}, {5, 1, 4, 5, 2, 0}}; 
del = {{2}, {4}}; 
a = Delete[a, del]; 
a = Delete[Transpose[a], del]; 
(a = Transpose[a]) // MatrixForm 

내 질문 : 더 나은 방법으로이 작업을 수행하는 삭제를 사용하여 짧은 방법 (또는 그 전문 트릭의 또 다른 하나)이 있습니까?

감사

+2

중복 : http://stackoverflow.com/questions/6258349/how-to-form-submatrices-with-some-non-consecutive-rows-and-columns-of-a-matrix . 닫기 투표 –

+0

유사한 질문 여기 : http://stackoverflow.com/questions/7537401/how-to-insert-a-column-into-a-matrix-the-correct-mathematica-way/7537692#7537692 –

+2

[This ] (http://stackoverflow.com/q/5299798/499167) question, ** Mathematica **의 행렬/행 목록을 선택/삭제하는 효율적인 방법은 특히 [reply]와 관련이있다. (http://stackoverflow.com/a/5300892/499167) WReach – tomd

답변

6

동일한 인덱스 열과 행을 제거하려는 경우 Part을 사용합니다.

a[[{1, 3, 5, 6}, {1, 3, 5, 6}]] // MatrixForm 

가보다 일반적인 당신이 Range으로 DeleteCases을 결합하는 뭔가 및 열/행 인덱스의 목록을 만들 수 있도록하기 위해하지만이 없을 경우 : 예 열 및 행 2, 4 a를 볼 수 있도록 제거 추가 정보 나는 그것을 (아직)하려하지 않았다.

편집

remove[a_?MatrixQ, pos_List] := Module[{tmp, length = Length[a]}, 

    tmp = DeleteCases[Range[length], Alternatives @@ pos]; 

    a[[tmp, tmp]] 

    ] 

remove[a,{2,4}] 
{{0, 2, 1, 0}, {4, 3, 3, 2}, {3, 4, 3, 3}, {5, 4, 2, 0}} 

Edit2가

remove2[a_?MatrixQ, pos_List] := Module[{tmp, length = Length[a]}, 

    tmp = Complement[Range[length], pos]; 

    a[[tmp, tmp]] 

    ] 

remove2[a,{2,4}] 
{{0, 2, 1, 0}, {4, 3, 3, 2}, {3, 4, 3, 3}, {5, 4, 2, 0}} 

시험이 모두 실제 세계의 문제.

+0

예, 좋습니다. 내가 생성 한 것은 삭제할 행/열 목록이므로'Delete'를 사용하여 고정되어 있습니다. 그러나이 목록을 쉽게 보완하여 삭제하지 않을 행 목록을 얻은 다음 표시된대로 'Part'를 사용할 수 있습니다. 이것은 좋은 해결책 인 것 같습니다. 내가 가지고있는 것보다 훨씬 낫다. 나는 이것을 생각해야만하기 때문에 더 많은 커피가 필요하다고 생각한다 : – Nasser

+0

위의'DeleteCases [Range [length], Alternatives @@ pos]'대신'Complement [length, pos]'를 사용하는 것이 조금 더 간단 할 것이다. – Nasser

+1

목록 길이에 달려 있다고 생각하지만 실제 문제에 대한 몇 가지 타이밍을 비교하고 가장 좋은 것을 볼 수 있습니다. –

0

당신은 확실히 드롭으로 예를 수행 할 수 있습니다

Drop[a, {2, 4, 2}, {2, 4, 2}] // MatrixForm 

나는이 얼마나 일반 모르겠지만, 어쩌면 그것이 올바른 방향을 설정하는 데 도움이됩니다.

+0

감사합니다,하지만 위의 작동하지 않습니다. '2 단계에서'옵션을 사용 중입니다. 이것은이 예제에서 매우 구체적입니다. 작동하지만 행/열 목록에 대해 작업해야하며 항상 2 단계 이상의 단계로 진행되는 것은 아닙니다. 내가 가진 것은 단지 예일뿐입니다. – Nasser

+0

@Nasser, 나는 많은 것을 생각했다. 따라서 한정어이다. –

4

이 이중 트랜스 방법보다 행 삭제하는 빠른 방법 같아야

a = {{0, 5, 2, 3, 1, 0}, 
    {4, 3, 2, 5, 1, 3}, 
    {4, 1, 3, 5, 3, 2}, 
    {4, 4, 1, 1, 1, 5}, 
    {3, 4, 4, 5, 3, 3}, 
    {5, 1, 4, 5, 2, 0}}; 
del = {{2}, {4}}; 

a = MapThread[Delete, {a, Table[del, {Length[a]}]}] 

타이밍이 변동이 있지만 다소 인위적인 예에서 빠르게이다

a = Table[RandomReal[], {1000}, {10000}]; 
del = Map[List, Union[Table[RandomInteger[{1, 10000}], {100}]]]; 
Timing[Transpose[Delete[Transpose[a], del]];] 

{0.25, 널 }

Timing[MapThread[Delete, {a, Table[del, {Length[a]}]}];] 

(0.125, 널}

+0

안녕하세요 Chris, SE 네트워크 아래 [별도의 Mathematica 사이트] (http://area51.stackexchange.com/proposals/37304/mathematica?referrer=hWeRiD9Qz0oIDM_9uBjtlA2)에 대한 제안이 있습니다. , mma (SO와 같은 프로그래밍 질문뿐만 아니라)와 관련된 모든 것. 우리는 발사 (24 명 남은 상태)에 매우 가깝습니다. 당신이 그 제안에 전념 할 수 있다면 좋을 것입니다. :) – abcd

1

이 방법은 Part 방법보다 훨씬 효율적이지 않지만 좀 더 투명하고 시간이 더 많이 걸립니다. 이 질문의

ReplacePart[a, {{2}, {4}, {_, 2}, {_, 4}} :> Sequence[]] 
+0

+1. 너무 나쁘면'Delete {a {{2}, {4}, {_, 2}, {_, 4}} '와 같이 쓸 수 없습니다. 그러나':> Sequence []'를 사용하여 그 부분을 대체하는 당신의 속임수는 내가 생각하지 못했던 것입니다. 나는 아직도 어떻게 작동하는지 잘 모르지만 그것은 그렇다. 나는 또한 당신의 해결책이 더 자연 스럽다고 생각합니다. 많은 Mathematica 명령과이를 사용하는 많은 방법! 매쓰 매 티카의 행렬 작업을위한 치트 시트 목록에 메서드를 추가 할 것입니다. – Nasser

+0

btw, 비록이 방법이 더 자연 스럽긴하지만 자동화를 사용하는 것이 거의 힘들다고 생각합니까? 더 많은 코드가 필요합니다. 그 이유는 유지할 (또는 보완하여 삭제할) 행/열 목록이 길고 실행중인 코드의 일부로 즉석에서 생성 될 수 있기 때문입니다. 따라서 위의 메서드를 사용하려면 명령의 일부인 {{n1}, {n2} ...}, {_ n1}, {_ n2}} ...} '를 생성하는 추가 코드를 작성해야합니다. 관련된 목록은 변수가됩니다. 감사 – Nasser

관련 문제