2014-05-21 2 views
0

n 번째 열의 지정된 행 수 k을 0으로 설정하는 쉬운 방법이 있습니까? 설명하기에 약간 까다로운 질문이므로 예제를 살펴 보는 것이 가장 좋습니다. 내 출력하므로, [row1 col1] = 0; [row2 col1] = 0 다음 [row3 col2]= 0; row4 col2]= 0 등 : 각 열 및 요소 블록에 지정된 수의 행을 0으로 설정하십시오.

k = 2 
B = 

0  2  3 
0  5  6 
7  0  9 
10  0 12 
13 14  0 
16 17  0 

당신이 어떤 제안/솔루션이 있습니까

A = 

1  2  3 
4  5  6 
7  8  9 
10 11 12 
13 14 15 
16 17 18 

나는 다음과 같이 행을 설정하고자 : 내가이 말을하자 루프가 for 인 경우 어떻게 해결할 수 있습니까? 아니면 다른 방법이 있습니까?

방법이 솔루션은 다음과 같이 뭔가 더 확장 될 수있다 : A =

1  2  3  1 2  3 
    4  5  6  4 5  6 
    7  8  9  7 8  9 
10 11 12 10 11 12 
13 14 15 13 14 15 
16 17 18 16 17 18 

B = 

0  0  3  1 2  3 
0  0  6  4 5  6 
7  8  0  0 8  9 
10 11  0  0 3  1 
13 14 15 13 0  0 
16 17 18 16 0  0 

답변

3

한 가지 방법 - 편집 된 질문에 대한

k = 2; 

row1 = 1:size(A,1) 
col1 = ceil([1:size(A,1)]./k) 
A(sub2ind(size(A),row1,col1))=0 

,이 같은 kron를 사용 -

k = 2; 

a1 = eye(size(A)./k); 
b1 = ones(k,k); 
A(logical(kron(a1,b1)))=0 
+0

+1 ... 기본적으로 내가 가진 동일한 해결책! – rayryeng

+1

@rayryeng 매우 비슷합니다! – Divakar

+0

@Divakar 이것은 나를 위해 완벽하게 작동했으며 확장에 대한 또 다른 질문을 추가했습니다. – vaitas

0

다음 코드는 MATLAB에서 실행하고, 당신이 원하는 것을 :

% Create A-matrix 
A = reshape(1:18,6,3) 
% Set specified datapoints to zero 
A([1,2],[1,1]) = 0 

을 다른 방법을, 각 요소를 따로 설정할 수 있습니다.

A(1,1) = 0 
A(1,2) = 0 

그리고 m KN OST와 일반적인 방법 :

A([1:k],n) = 0 
2

문제가되지 않는다. 정확히이 값 k을 기준으로 0으로 설정하려는 행과 열을 파악한 다음 sub2ind을 사용하여 행렬에 액세스 할 수있는 단일 색인을 얻을 수 있습니다. 이것은 열 - 주요 형식입니다. 그런 다음 이것을 사용하여 모든 값을 0으로 설정할 수 있습니다. 다음은 그 예입니다.

rows = [row1 row2 row3]; 
cols = [col1 col2 col3]; 

%// Get column major indices 
ind = sub2ind([height width], rows, cols); 

%// Set the values in this matrix to 0. 
B(ind) = 0; 

은 이제 예를 들어, 우리는 모든 행에 액세스해야합니다 우리는 우리가 전에 먼저 행렬의 widthheight를 알아야합니다. 그러나 열의 경우 각 열의 k 요소에 액세스하여 겹치지 않도록해야합니다. 따라서, 우리는 지금처럼 작업을 수행 할 수 있습니다

k = 2; 
B = reshape(1:18, 6, 3).'; 
rows = 1 : 6; 
cols = ceil(rows/k); 
ind = sub2ind([rows cols], rows, cols); 
B(ind) = 0; 

당신는 다음과 같은 것을 얻을 것이다 :

B = 

0  2  3 
0  5  6 
7  0  9 
10  0 12 
13 14  0 
16 17  0 
+1

+1 : 특별한 경우로서 제 질문을 포함한 두 번째 질문에 대해서는

A(mod(0:numel(A)-1, size(A,1)+k) < k) = 0; 

! :) – Divakar

0

처음으로 질의 : 해당 유사성

c = repmat({ones(k,size(B,2)/size(B,1)*k)}, size(B,1)/k, 1); 
B = B.*~blkdiag(c{:}) 
관련 문제