2013-04-18 3 views
6

저는 Matlab에서 빠른 구현을 찾고 있다는 간단한 문제가 있습니다. 내가 값의 배열을 가지고, 이제 가정 해 봅시다 :||에 피연산자 및 & 연산자는 논리 스칼라 값으로 변환 가능해야합니다

a = floor(rand(5,5).*255) 

그때 비슷한 크기의 임계 값의 배열을,의는 그것의 가정 해 봅시다 : a 내에서 값을

a_thresh = floor(rand(5,5).*255) 

가 대응하는 것보다 0.5 배 더 작은 경우

a(a < a_thresh.*0.4) = 0 
a(a > a_thresh.*1.2) = 0 
0 : , 유사 1.2에 대한 a_thresh의 값도 0으로 설정한다 - a_thresh 가치 I 출력이 0가되고 싶어요

0.4x와 0.5x 및 1.0x와 1.2x 사이의 값의 경우, 비례하는 양을 원한다. 그리고 0.5와 1.0 사이의 값은 a의 값을 그대로 사용하고 싶다.

피연산자 ||하기 : I라는 오류를 얻을 그러나

a(a>= a_thresh .* 0.4 && a <a_thresh.* 0.5) = ((a - a_thresh.*0.4)/(a_thresh.*0.5 a_thresh.*0.4)) .* a; 

: 나는 다음과 같은 것을 사용 수 있다고 생각 및 & & 작업은 논리적 스칼라로 변환이

이 문제를 해결하는 방법에 대한 조언을 값이어야합니다? 분명히 이것을하기 위해 루프를 사용할 수는 있지만 사소한 일이지만 코드를 벡터화 된 상태로 유지하려고합니다.

답변

14

&&스칼라에서만 작동 할 수 있으며, &은 배열에서도 작동 할 수 있습니다. &&&으로 변경해야 작동합니다 (자세한 내용은 this question에서 확인할 수 있습니다). 댓글에 설명 된 두 번째 문제에 관해서는
:

업데이트 당신이 (특정 요소를 선택) 인덱스를 사용하고 있기 때문에 왼쪽에있는 요소의 수는 다른, 오른쪽에 당신은에 최선을 다하고 있습니다 전체 행렬 aa_thresh.

당신은 양쪽에서 인덱스를 사용해야합니다, 그래서 변수에 저장하는 것을 제안하고 배열 첨자로 사용,이 라인을 따라 :

idx = (a >= a_thresh*0.4 & a < a_thresh*0.5); 
a(idx) = ((a(idx)-a_thresh(idx)*0.4) ./ (a_thresh(idx)*0.5*a_thresh(idx)*0.4)) .* a(idx); 

잘 모르겠어요 경우 계산 자체 맞습니다. 그래서 확인해 드리겠습니다.

+0

환상적인 - 그 & & && 문제를 해결 - 내가 어떻게 그걸 몰랐는지, 고마워! 이제는 오른쪽에있는 요소의 수가 왼쪽과 다른 작은 문제가 있습니다. 이것을 고치는 현명한 방법이 있습니까? – trican

+0

@trican 잘 해결했습니다. 업데이트를 참조하십시오. –

+1

많은 분들께 감사드립니다. Eitan - 솔루션이 완벽하게 작동합니다 - 분명히 충분히 일반적이어서 Matlab 작업의 다른 곳에서 사용할 수있는 방법을 알 수 있습니다. – trican