2014-12-21 3 views
0

저는 7 개의 인수를 취하여 행 벡터를 반환하는 함수가 있습니다. 처음 세 인수는 벡터 (열, 열, 행)이며 나머지 네 개는 선택적 스칼라입니다.bsxfun() 잘못된 출력 치수

bsxfun()을 사용하여 마지막 인수의 벡터에 함수를 적용하고 싶습니다. 아래는 그렇게하려는 나의 시도입니다.

o = @(m,pulse,N0,samples_per_pulse,sample_select,filter,channel_cutoff) ELE452Functions.EvaluateBER(m,pulse,N0,samples_per_pulse,sample_select,filter,channel_cutoff); 
oo = @(m,pulse,N0,samples_per_pulse,sample_select,filter,channel_cutoff) bsxfun(@(N0,channel_cutoff) o(m,pulse,N0,samples_per_pulse,sample_select,filter,channel_cutoff), N0' , channel_cutoff); 

나는 벡터로 함수를 호출하려고

oo(m,pulse,N0,1,1,1,[0.5 0.2]); 예를 들어,이 오류가 얻을 : 나는 bsxfun을 사용하여 경험하고 있지 않다

Error using bsxfun 
Invalid output dimensions. 

을 나는 설명서를 따라하려고 노력했다.

업데이트 : 아래의 코드를 루프에서 다시 작성 bsxfun를 사용 (개선) 할 :

이 내 질문을 할 수있는 명확한 방법이 될 수 있습니다.

for i=1:length(channel_normalized_cuttoffs) 
    BER_LPchannel(i,:) = ELE452Functions.EvaluateBER(m,pulse,N0,1,1,1,channel_normalized_cuttoffs(i)); 
end 
+0

정확히 ELE452Functions.EvaluateBER''이다 무엇을 ? – Divakar

+0

EvaluateBER는 ELE452Functions 클래스의 함수입니다. 그것은 별도의 m 파일에 있습니다. – user137017

+0

아마도'permute'를 사용하여 세번째 dim -'bsxfun (........ permute (channel_cutoff (:), [3 2 1]))'에''channel_cutoff'를 보낼 필요가 있습니다. – Divakar

답변

1

bsxfun 뒤에 아이디어는, (에 대한 bsxfun 스탠드에서 b) 두 요소의 가능한 모든 조합에 대한 특정 기능을 평가하는 것입니다 각각 배열 중 하나에서 오는. (NB : 행과 열 벡터와 함께 사용하면 유효하지만, bsxfun도 더 많은 작업을 수행 할 수 있습니다.)

간단히 말해서 : 단일 배열의 모든 항목에 대해 함수를 계산하십시오. 그래서 bsxfun은 올바른 선택이 아닙니다.

대신 arrayfun을 사용할 수도 있지만, Matlab JIT 컴파일러가 단순함을 고려하여 대부분 최적화 할 수있는 것처럼 보이기 때문에이 코드는 원래 for 루프보다 훨씬 잘 수행되지 않을 수 있습니다. 나는 당신의 함수의 코드를 가지고 있지 않기 때문에

, 나는 그것을 테스트 할 수 아니지만, 솔루션은 다음과 같이 많이 볼 수 있습니다

evalBER = @(CNcutoffi) ELE452Functions.EvaluateBER(m,pulse,N0,1,1,1,CNcutoffi); 
BER_LPchannel = arrayfun(evalBER, channel_normalized_cuttoffs, 'UniformOutput', false) 
+1

arrayfun (evalBER, channel_normalized_cuttoffs, 'UniformOutput', false)가 작동했습니다. 나를 올바른 방향으로 향하게 해주셔서 감사합니다. – user137017

+0

'tic'과'toc'를 사용하여 시간을 재어 보시겠습니까? 나는 'for' 반복문에 비해 시간차에 관심이있다. – knedlsepp

+0

예. for 루프는 7.312199 초 걸렸고 코드는 6.897681을 사용했습니다. – user137017