2013-01-15 4 views
15

나는 두 벡터, idx1idx2을 가지고 있는데 그 사이의 값을 얻고 싶습니다. idx1idx2 숫자가 아닌 벡터한다면, 나는 다음과 같은 방법으로 그렇게 할 수 있습니다 : 콜론 (:) - MATLAB의 두 벡터 사이의 값을 벡터화

idx1=1; 
idx2=5; 
values=idx1:idx2 

% Result 
% values = 
% 
% 1  2  3  4  5 

하지만 내 경우에는

, idx1idx2는 가변 길이의 벡터이다. 예를 들어 길이가 2 인 경우 :

idx1=[5,9]; 
idx2=[9 11]; 

사이에 값을 직접 입력 할 수 있습니까? 내가 idx1(1):idx2(1)idx1(2):idx2(2),이 별도로 각 열에 대한 값을 추출, 그래서 다른 해결책이없는 경우, 나는이 작업을 수행 할 수 있습니다 작업을 수행 할 수 있습니다 알고

values = [5  6  7  8  9  9 10 11] 

: 이것은, 다음과 유사한입니다 for-loop,하지만 아마도 Matlab이 더 쉽게 할 수 있습니다.

+0

는'values'는 MATLAB에서 할 수 없습니다. 3- 벡터에 의해 수직으로 결합 된 5- 벡터? – petrichor

+0

예, 맞습니다. 죄송합니다. 나는 그것을 바로 잡을 것입니다. 값이 모두 같은 행에 있으면 상관 없습니다. 인덱스 사이에 모든 값이 필요합니다. – Digna

+0

Mathworks의 Loren이 [콜론 (Colon) 개념을 벡터화] (http://blogs.mathworks.com/loren/2008/10/13/vectorizing-the-notion-)에서이 주제에 대한 훌륭한 블로그 게시물이 있습니다. of-colon) – knedlsepp

답변

11

샘플 출력이 유효하지 않습니다. 행렬은 길이가 다른 행을 가질 수 없습니다. 당신이 할 수있는 것은 arrayfun를 사용하여 셀 어레이를 만들 수 있습니다 :

values = arrayfun(@colon, idx1, idx2, 'Uniform', false) 

, 당신이 사용할 수있는 벡터에 결과 셀 어레이를 변환하려면 cell2mat :

values = cell2mat(values); 

또는 경우 결과 셀에서 모든 벡터 배열의 길이가 같으면 다음과 같이 출력 행렬을 구성 할 수 있습니다.

values = vertcat(values{:}); 
+1

감사합니다. 도움이됩니다. 값을 필요로하고 어떤 행을 얻었는지 신경 쓰지 않기 때문에 다음과 같이'horzcat'과'unique'를 사용할 수 있습니다 :'values ​​= unique (horzcat (values ​​{:}));' arrayfun에 대해 더 자세히 읽으 려한다면, 매우 유용 할 것 같습니다. – Digna

+2

@Digna 꽤 보일지 모르지만 그것을 남용하지 마십시오. 'for' 루프와 비교할 때 상당히 느립니다 ("벡터화 된"솔루션이 존재할 경우 더욱 그렇습니다). 그래서 보통 속도를 고려하지 않는 한 후자를 선호합니다 ... 또한' [horahcat] 대신 [blah blah]'를 사용합니다. –

0

집합의 조합을 취하십시오. idx1의 값을 감안할 때 idx2 당신은 공급 원하는대로 값 [5 6 7 8 9 10 11]와 벡터를 얻을 것입니다

values = union(idx1(1):idx1(2), idx2(1):idx2(2)); 

를 실행합니다.

+0

답변 해 주셔서 감사합니다. 문제는'idx1'과'idx2'는 길이가있을 수 있습니다 (처리중인 신호에 따라 다름).이 경우에는이 솔루션을 적용하기 어려울 것입니다. 그렇지 않습니까? (아마 나는 뭔가를 놓치고있어) :) – Digna

+0

아, 우. 죄송합니다. 질문을 잘못 이해했습니다. 'arrayfun'을 사용하여 데카르트 제품을 가져 오는 것이 여기에있는 길일 것 같습니다. – benjwadams

0

@ Eitan의 솔루션이 제대로 작동하지 않을 수 있습니다. 콜론에 대한 매개 변수를 지정해야합니다. 다음 작은 수정은 내 R2010b 버전 작업있어 :

step = 1; 
idx1 = [5, 9]; 
idx2 = [9, 11]; 
values = arrayfun(@(x,y)colon(x, step, y), idx1, idx2, 'UniformOutput', false); 
values=vertcat(cell2mat(values)); 

step = 1 실제로 colon의 기본 값이고, UniformUniformOutput 대신 사용할 수 있습니다,하지만 난 위해서 다음을 포함 시켰 있습니다 완전 함.

0

로렌으로 멋진 블로그 게시물이 있습니다. Vectorizing the Notion of Colon (:). 그것은 arrayfun를 사용하는 것보다 (큰 배열을 위해) 약 5 배 빠른 답변 또는 for -loop을 포함하고 실행 길이 디코딩과 유사합니다 :

아이디어는 결장 밖으로 시퀀스 확장하는 것입니다. 각 시퀀스의 길이를 알고 있으므로 출력 배열의 시작점을 알고 있습니다. 에 시작 값 뒤의 값을 1로 채 웁니다. 다음으로 나는 한 시퀀스의 끝에서 다음 시퀀스의 시작으로 점프 할 의 양을 계산합니다. 반복되는 시작 값이 있으면 점프가 음수 일 수 있습니다. 이 배열이 채워지면 출력은 단순히 누적 합계 또는 누적 합계입니다.

function x = coloncatrld(start, stop) 
% COLONCAT Concatenate colon expressions 
% X = COLONCAT(START,STOP) returns a vector containing the values 
% [START(1):STOP(1) START(2):STOP(2) START(END):STOP(END)]. 

% Based on Peter Acklam's code for run length decoding. 
len = stop - start + 1; 

% keep only sequences whose length is positive 
pos = len > 0; 
start = start(pos); 
stop = stop(pos); 
len = len(pos); 
if isempty(len) 
    x = []; 
    return; 
end 

% expand out the colon expressions 
endlocs = cumsum(len); 
incr = ones(1, endlocs(end)); 
jumps = start(2:end) - stop(1:end-1); 
incr(endlocs(1:end-1)+1) = jumps; 
incr(1) = start(1); 
x = cumsum(incr);