2011-03-14 6 views
4

이 질문은 내가 여기에서 묻는 질문의 연속이다 : Simple way to delete a matrix column in Mathematica @belisarius와 @Daniel이 매우 유용한 답을 제공했다.Mathematica에서 행렬의 행/열리스트를 효율적으로 선택/삭제

내가 일반적으로 시도하는 것은 매트릭스에서 특정 라인과 컬럼을 추출하는 것입니다. 또는 지정된 라인이 제거 된 후에 남는 것은 무엇입니까? 그래서 이것은 공식적으로 다음과 같이 쓸 수 있습니다 : TakeOperator와 Drop Operator를 다음과 같이 찾으십시오 :

TakeOperator [A, {i1, .., ip}, {j1, ..., jq}] = (A [[ik] [[JL]) (1 < < = K = P, L = 1 < < 우리는 주목 = Q) = Table[A[[ik]][[jl]],{k,p},{l,q}]

IC에서 I'1 = {..., i'p '} = Complement {{1, ..., Length[A]}, {i1, ..., ip}]; Jc = , {j1, ..., jq}];

DropOperator [A, {i1, ..., iq}] = (A [[ik] [[jl]]) (1 < = k '< = p '1 < = L'< = Q ') =

상술 트릭 마찬가지로 Table, 그 방법 표를 사용하는 것이 매우 비효율적이지만 Table[A[[ik']][[jl']],{k',p'},{l','q}].

In: [email protected][a = RandomInteger[1000, {5000, 5000}];] 

Out:0.218 

In:Clear[b,c] 

In:[email protected][ 
    b = Table[ 
    If[i < 100, If[j < 100, a[[i]][[j]], a[[i]][[j + 1]]], 
    If[j < 100, a[[i + 1]][[j]], a[[i + 1]][[j + 1]]]], {i, 
    4999}, {j, 4999}]] 

Out:140.807 

In:[email protected][c = Drop[a, {100}, {100}]] 

Out:0.093 

In:c===b 

Out:True 

참고 : 이전 게시물 Drop의 사용에 관하여, 나뿐만 아니라 그것을 사용하는 방법에 대한 생각,하지만 난을 선택한 경우

그냥 아이디어를 제공하기 위해, 나는 @ 벨리 사리우스 예를했다 설명서에서 @belisarius와 @daniel이 제안한 방식대로 구현할 제안은 없었습니다. 향후 릴리스에서 설명서가 해당 방향으로 업데이트 될 수 있다면 도움이 될 것입니다.

+0

당신은 ** 더 자세한 정보를 확인해야합니다 ** 도움 섹션 다음 정의는 것을 악용. 유용한 정보가 있습니다. ** Drop ** 도움말 항목에서'{n} \t element n only'을 찾을 수 있습니다 : D –

+0

@ belisarius : 예. 그냥 봤어. 그것은 미로에서 조금 길게 느껴진다. .. 고마워. – Phil

+0

그 느낌은 정상입니다. 도움말 시스템을 탐색하는 방법을 배우는 데 시간이 걸리며 함수 목록이 _huge_ –

답변

8

Part 직접 인덱스의 목록을 지원합니다. 예 사용이

takeOperator[a_?MatrixQ, rows_List, cols_List] := 
    a[[rows, cols]] 

dropOperator[a_?MatrixQ, rows_List, cols_List] := 
a[[##]]& @@ complementaryIndices[a, rows, cols] 

complementaryIndices[a_?MatrixQ, rows_List, cols_List] := 
    Complement @@@ Transpose @ {Range /@ Dimensions @ a, {rows, cols}} 

:

a = RandomInteger[1000, {5000, 5000}]; 
First @ Timing @ takeOperator[a, Range[1, 5000, 2], Range[1, 5000, 2]] 
(* 0.016 *) 

First @ Timing @ dropOperator[a, Range[1, 5000, 2], Range[1, 5000, 2]] 
(* 0.015 *) 
3

상당히 효율적인 방법으로 명시적인 범위를 사용할 수도 있습니다. 그들은 좀 더 융통성을 제공 할 수 있습니다. 당신의 본보기가 있습니다.

a = RandomInteger[1000, {5000, 5000}]; 

Timing[b = Drop[a, {101}, {101}];] 

아웃 [66] = {0.041993는 널}

Timing[ 
    c = a[[Join[Range[100], Range[102, 5000]], 
    Join[Range[100], Range[102, 5000]]]];] 

출력 [67] = {0.061991는 널}

c == b 

출력 [62] = TRUE

나는 또한이 설정에서 작동하도록하는 방법을 알지 못한다. 배열을 깔끔히 때

다니엘 Lichtblau 볼프람 연구

+0

입니다. @WReach : 감사합니다. 요점. WRI가 mathematica의 다양한 기능을 사용하는 소프트웨어 설명서에 그녀를 제공 한 선택 지원을 원활하게 통합 할 수 있다면 도움이 될 것이라고 생각합니다. – Phil