2012-04-01 3 views
0

이 행렬의 크기는 10000입니다. 일부 행을 제거하려면 임의의 위치에서 50을 말하게하십시오. 행을 제거한 후 행렬의 크기는 9950이됩니다. 따라서 원래의 10000에서 모든 요소의 인덱스를 가져올 수 있습니다. 원래 행렬의 인덱스로 9999 번째 요소의 값을 가져 오려고한다고 가정 해보십시오. 하지만 이제는 새 행렬의 크기가 일부 행을 제거한 후 9950이므로 원래 행렬에서 9999 번째 요소를 어떻게 알 수 있습니까? 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?행렬에서 일부 행을 제거한 후 요소의 새 색인을 가져옵니다.

+0

행을 제거하는 방법에 따라 달라집니다 - 행렬 생성을 보여주는 (재현 가능한) 코드의 작은 조각을 제공하고 & 제거 할 행을 결정하는 방법은 무엇입니까? 건배. –

+0

나는 그것을 알아 냈다. 난 그냥 원래의 인덱스를 사용할 수 있습니다 - 요소의 수를 제거하려면 새 매트릭스에서 요소의 인덱스를 가져옵니다. –

+0

아니, 할 수 없습니다. 원래 색인이 40이라고하면 제거 된 수에서 50을 뺀 값이 -10이며 유효한 색인이 아닙니다. 삭제 된 엘리먼트의 수를 원래의 인덱스까지 감산해야합니다. 따라서 제거한 엘리먼트의 인덱스를 저장해야합니다. –

답변

2

매트릭스를 무작위로 축소하려고하지만 각 요소의 출처를 기억하고 있습니까? 그리고 원래 요소가 어디에서 끝났는 지 알아? 이를 수행하는 한 가지 방법은 축소 된 행렬의 요소가 어디서 왔는지를 기억하는 색인을 유지하는 것입니다.

이러한 요소가 어디에서 온의 원래 행렬

A = rand(10000,1); 

기억 인덱스입니다 생각한 것은 : 이제

A_idx = [1:length(A)]'; 

, @yuk에서 빌리의 무작위 일부 요소를 제거 할 수 :

rp_idx  = randperm(numel(A)); 
kill  = rp_idx(1:50); 
A(kill)  = []; 
A_idx(kill) = []; 

이제는이 절차를 수행하고 요소를 제거하는 여러 번, origina l 위치는 A(i)이고 A_idx(i)입니다.

원래 행렬의 k 번째 요소

이제 새로운 수축 매트릭스

new_idx = find(A_idx == k) 

에서 찾을 수있다. 찾고있는 요소가 제거 된 요소 중 하나 인 경우 new_idx은 비어 있습니다.

0

일반적으로 제거 할 요소의 색인이 있으면 한 번에 모두 제거 할 수 있습니다. 예를 들어, 10000 벡터 A 중에서 50 개 요소의 임의 인덱스를 생성합니다. 당신이 어떤 이유로, 요소를 하나씩 제거 인덱스를 정렬하고 끝에서 시작해야하는 경우

rp_idx = randperm(numel(A)); 
rp_idx_50 = rp(1:50); 

그런 다음 우리는

A(rp_idx_50) = []; 

로 그 (50 개) 요소를 제거 할 수 있습니다. 이 경우 새 색인을 찾을 필요가 없습니다.

관련 문제