2014-11-25 6 views
0

특정 매개 변수 값에 대한 함수를 평가하려는 MATLAB의 시나리오가 있습니다. 매개 변수는 임의의 수의 배열에서 추출되며 각 배열은 임의의 수의 요소를 가질 수 있습니다. 함수를 호출하기 전에 배열 수와 요소 수를 알고 있습니다.MATLAB에서 중첩 된 for 루프를 피하십시오

예를 들어, 배열 A = [a1 a2 ... aL], B = [b1 b2 ... bM]C = [c1 c2 ... cN]이 있다고 가정 해 보겠습니다.

for i = 1:length(A) 
    for j = 1:length(B) 
     for k = 1:length(C) 
      myfunc(A(i), B(j), C(k)) 
     end 
    end 
end 

I는 AL 요소 BM 요소 CN 요소 복용 고려하고 셀 어레이에 그들을 flatenning,이 셀 어레이 위에 루프 단일로 반복하고있다.

이런 식으로 MATLAB 함수가 있는지 궁금합니다 ... 결과가 셀 배열 일 필요는 없습니다. 여러 중첩 된 for 루프를 피하는 방법을 원합니다. 적은 수의 루프에서는 문제가 없지만이 수가 증가하면 읽고 유지하기가 매우 어렵습니다.

답변

4

ndgrid은 여러 중첩 루프를 하나로 플랫 화하는 데 사용할 수 있습니다. 모든 조합의 값 (변수 aa, bb, cc)을 생성하므로 모든 조합을 탐색하는 데 단일 색인 (아래 k)을 사용할 수 있습니다. 그러나 모든 조합을 생성하려면 L, M, N에 따라 많은 메모리가 필요할 수 있습니다.

0

허용 된 대답의 방향을 알려줌으로써 모든 배열로 일반화하는 기능을 만들었습니다. 결과는 N- 튜플의 2D 배열입니다. 여기서 N은 입력 배열의 수입니다.

function [Result] = makeTuples(varargin) 

nInputArgs = length(varargin); 
b = cell(1, nInputArgs); 
a = flip(varargin); 

[b{:}] = ndgrid(a{:}); 
bb = flip(b); 
nOutputs = length(bb); 
N = numel(bb{1}); 

Result = zeros(N, nInputArgs); 
arr = zeros(1,nInputArgs); 
for j = 1:N 
    for k = 1:nOutputs 
     arr(k) = bb{k}(j); 
    end 
    Result(j,:) = arr; 
    arr = zeros(1,nInputArgs); 
end 
end 
관련 문제