2012-04-13 2 views
1

필자는 행의 끝까지 1-3, 7-9, 13-15 열을 추출하고자하는 데이터 세트가 있습니다.MATLAB : 하위 그룹으로 열 그룹을 추출 하시겠습니까?

예를 들어, 표준 마법 함수 매트릭스

A = 마법 (10)

을 만들 =

92 99  1  8 15 67 74 51 58 40 
98 80  7 14 16 73 55 57 64 41 
4 81 88 20 22 54 56 63 70 47 
85 87 19 21  3 60 62 69 71 28 
86 93 25  2  9 61 68 75 52 34 
17 24 76 83 90 42 49 26 33 65 
23  5 82 89 91 48 30 32 39 66 
79  6 13 95 97 29 31 38 45 72 
10 12 94 96 78 35 37 44 46 53 
11 18 100 77 84 36 43 50 27 59 

I는 I는 명령 (3)의 간격으로, (1)에서 시작하여 하나의 열을 추출 할 수 있음을 알고

백45경1천5백15조5백36억9천1백36만3천2백10

AEX가 = (:, 1 : 3 : 단부)

AEX =

92  8 74 40 
98 14 55 41 
4 20 56 47 
85 21 62 28 
86  2 68 34 
17 83 49 65 
23 89 30 66 
79 95 31 72 
10 96 37 53 
11 77 43 59 

내가 아닌 열의 그룹을 추출한다고 가정 (예를 들어 1-3, 7-9 등).

수동으로 모든 열 번호를 지적하지 않고도이 작업을 수행 할 수 있습니까?

도움 주셔서 감사합니다.

Aex = A(:,[1:3 7:9]) 

: 라스무스

답변

11

이 당신이 찾고있는 무엇인가?

0

결과를 모두 다른 큰 행렬에 연결하고자한다고 가정합니다. 이런 경우

, 이걸 시험해 : 아마 매트릭스 수학 규칙을 단축 할 수

result = A(diag(0:2)*ones(3,floor((size(A,2) - 3)/6) + 1) + ... 
      ones(3,floor((size(A,2) - 3)/6) + 1)*diag(1:6:(size(A,2)-3))) 

합니다. 또한, (더 적합 할 수 있습니다도 등),이 문제가 예상보다 더 많은 일을하도록 수정 될 수 있도록 값을 매개 변수화 할 수

a는 "그룹"( length([1 2 3]) = length([7 8 9]) = ... = 3)의 크기
a = 3;   
b = 6;   

result = A(diag(0:a-1)*ones(a,floor((size(A,2) - a)/b) + 1) + ... 
      ones(a,floor((size(A,2) - a)/b) + 1)*diag(1:b:(size(A,2)-a))) 

, 등을 b 당신이 여기 세포에 넣어, 그들을 분리하려는 경우 (귀하의 예제에서 [1...7...13...]) 열 간격

이지만, 그들은 당신이 필요로 어디든지 갈 수 있습니다 :

a = 3; 
b = 6; 
results = {}; 
for Cols = 1:b:(size(A,2)-a) 
    results{end+1} = A(:, Cols:(Cols+2)); 
end 

I didn를 '티 이들 중 하나의 속도를 확인하지만, 나는 첫 번째 것이 더 빠를 것이라고 생각한다. 용어를 좀 더 쉽게 읽을 수 있도록 분할하여 코드를 작성하는 데 항상 최선의 방법은 아닌 단일 행에 맞 춥니 다.

+1

wtf ?????????? (주석 길이에 대한 SO의 한계 때문에 너무 많은 물음표) –

+0

@high 그렇게 나쁘지 않습니까? –

+0

나는 그것이 나쁘다는 말을하지는 않았지만, Matlab에서 훨씬 간단한 형식을 가진 무언가를하는 매우 복잡한 방법이라고 말할 수 있습니다. 할 수있는 한 열심히 노력하십시오. 내 노력과 비교할 때 제안 된 솔루션에서 어떤 이점도 볼 수 없습니다. 나는 또한 SO 커뮤니티가 당신의 대답을 아직 포기하지 않았 음을 관찰합니다. 그게 다야. –

0

이 수행하는 간단한 방법 :

M = magic(10); 

n = size(M,2) 
idx = sort([1:3:n 2:3:n 3:3:n]) 
M(:,idx) 

그러나 만약, 제거의 패턴을 유지하려는 colums의 패턴보다 간단을 대신 이것을 사용할 수 있습니다

A = magic(10); 
B = A; 
B(:,4:3:end)=[]; 
B(:,4:3:end)=[]; %Yes 3x the same line of code. 
B(:,4:3:end)=[]; 
관련 문제