2016-07-11 2 views
1

가 나는 1과 3 사이의 요소를 추출하고자, 각 행에 대한 4 × 4 행렬추출물 요소/벡터 예컨대

A = [1, 2, 3, 4; 
     2, 1, 4, 3; 
     1, 2, 4, 3; 
     4, 1, 2, 3;]; 

있다 (매트릭스는 항상 어떤 요소가 가정 1에서 3 사이, 1은 항상 3보다 앞에옵니다). 예를 들어, 같은 셀을 반환 [{2} {4}, {2,4}, {2}, 또는 심지어 더

B= [0, 1, 0, 0; 
    0, 0, 0, 1; 
    0, 1, 0, 1; 
    0, 1, 0, 0;]; 

이제 I는 각 행에 대해 반복 하하고, 매트릭스와, 1과 3의 인덱스를 찾은 다음 그들 사이의 인덱스를 0으로 설정하십시오. 즉,

B = zeros(4,4); 
    for i = 1 : size(A,1) 
     ind1 = find(A(i,:) ==1); 
     ind2 = find(A(i,:) ==3); 
     B(i, A(i,ind1+1:ind2-1)) = 1; 
    end 

이 매트릭스 B 또는 셀을 생성하는 쉬운 방법이 있습니까? 모든 제안을 부탁드립니다.

+1

udnerstand 방법 사이가 정의됩니다. 당신은'[1 2 3]'을 찾을 수있는 지점을 의미합니까? 나는'B'의 3 행을 이해하지 못한다. –

+1

또한이 네 번째 내가 – shamalaia

+2

GameOfThrows의 B 나 – shamalaia

답변

4

좋아, 이것은 쉽게 해결되지 않을 수도 있습니다,하지만 루프를 제거하지, 그래서 더 빨리 계산해야한다 : 아이디어는 대신 1과 3 사이의 숫자를 찾아로 설정하려고하다

B=zeros(4,4); 
B(A == 1) = 1; 
B(A == 3) = 1; 
C = cumsum(B')'; 
B(C>=2) =1; 
B(C< 1) =1; 

%finally you want to invert this: 
B = (B-1)*-1; 

>> B = 

0  1  0  0 
0  0  1  0 
0  1  1  0 
0  0  1  0 

==========이 부분은 두 번째 편집 후 적용 ======= : 1, I 1, 3 이외의 숫자를 발견하고 0으로 사람들을 설정하기 위하여려고하고있다 ===

D = A.*B % this seems to be the cell indexes you are after? 

D = 

0  2  0  0 
0  0  4  0 
0  2  4  0 
0  0  2  0 

E = zeros(4,4); 
for t = 1:size(A,1) 
    E(t,D(t,D(t,:)>0)) = 1; %This re-applies the index numbers and create a new index matrix through a loop........ 
    %or you can use E(t,D(t,~~D(t,:))) = 1 to same effect, Thanks to @Dev-iL 
end 


>> E = 

0  1  0  0 
0  0  0  1 
0  1  0  1 
0  1  0  0 

이렇게하면 A에 대해 1과 3 사이의 요소 색인이 생기므로 논리 색인을 사용하여 원하는 셀 번호를 찾을 수 있습니다.

+1

에 대한 올바른 것 같습니다 그러나이 B 그가 마지막에 A.의 *의 B를했기 때문에, 저에. –

+0

@AnderBiguri 다른 말하고 싶지만 ... 이것은 OP가 그의 게시물에서 보여준 것과는 여전히 다르다. (편집되었습니다, 지금 보았습니다) – GameOfThrows

+1

하지만를 만들어 보자 작전 B –

2

내 솔루션은 이미 제안 된 것과 다르지 않지만 bsxfun이 있습니다. 그렇다면 왜 그렇습니까? :)

function B = q38307616 

A = [1, 2, 3, 4; 
    2, 1, 4, 3; 
    1, 2, 4, 3; 
    4, 1, 2, 3;]; 

At = A.'; 

tmp = arrayfun(@colon,find(At==1)+1,find(At==3)-1,'UniformOutput',false); 
% [tmp{:}] gives us the indices of the elements we should be considering 

B = 0*A; %preallocation 
for ind1 = 1: numel(tmp) 
    B(ind1,:) = sum(bsxfun(@eq,At(tmp{ind1}).',1:4),1); %1:4 are the allowable values 
end 

"보너스"GameOfThrows'B 동일 각 행에 1과 3 사이의 요소의 논리적지도를 얻는 또 다른 방법이있다 기준 : 내가 그나마

tmp2 = reshape(full(sparse(~~[tmp{:}],[tmp{:}],~~[tmp{:}],1,numel(A)).'),size(A));