2011-12-22 3 views
4

짧은 목록 (두세 개의 요소라고합시다)이 있다면 여러 변수로 나누는 기능을 갖고 싶습니다. 다음과 같은 것 :matlab에서 여러 변수로 목록을 나눕니다

li=[42 43]; 
[a b]=split(li) 
--> a=42 
--> b=43 

나는 matlab에서 내 코드를 더 짧게 만들 방법을 찾고있다. 이것은 하나의 예를 들어 어떤 상황에서 좋은 것 :

positions=zeros(10,3); 
positions= [....]; 
[x y z]=split(max(positions,1)) 

대신 일 :

pos=max(positions,1) 
x=pos(1); 
y=pos(2); 
z=pos(3); 

답변

4

만에 다른 변수로 목록에서 값을 추출 할 수 있습니다 이 작업을 수행하는 방법은 deal을 사용하는 것입니다. 그러나 이는 셀 배열에만 적용되거나 명시 적 인수는 deal입니다. 따라서 행렬/벡터를 처리하려면 먼저 num2cell/mat2cell을 사용하여 셀 배열로 변환해야합니다. 예컨대 :

% multiple inputs 
[a b] = deal(42,43) % a=2, b=3 
[x y z] = deal(zeros(10,1), zeros(10,1), zeros(10,1)) 

% vector input 
li = [42 43]; 
lic = num2cell(li); 
[a b]=deal(lic{:}) % unforunately can't do num2cell(li){:} 
% a=42, b=43 

% matrix input 
positions = zeros(10,3); 
% create cell array, one column each 
positionsc = mat2cell(positions,10,[1 1 1]); 
[x y z] = deal(positionsc{:}) 

첫 번째 형태는 명시 적으로 셀 어레이를 만들기 위해 당신을 필요로하지 않기 때문에 (deal(x,y,...)) 좋은입니다.

그렇지 않은 경우 행렬을 셀 배열로 변환해야 다시 변환 할 때 deal을 사용할 가치가 없다고 생각합니다. 단지 오버 헤드를 저장하십시오. 어떤 경우에도 여전히 3 행이 필요합니다. 먼저 행렬을 정의하고 (예 : li) 셀 (lic)로 변환 한 다음 deal (deal(lic{:}))을 수행합니다.

function varargout = split(x,axis) 
% return matrix elements as separate output arguments 
% optionally can specify an axis to split along (1-based). 
% example: [a1,a2,a3,a4] = split(1:4) 
% example: [x,y,z] = split(zeros(10,3),2) 
if nargin < 2 
    axis = 2; % split along cols by default 
end 
dims=num2cell(size(x)); 
dims{axis}=ones([1 dims{axis}]); 
    varargout = mat2cell(x,dims{:}); 
end 
: 당신이 정말 이상 분할 축을 정의 할 수 있습니다 당신이 당신 자신의 기능을 할 수 있도록 this question의 솔루션, 여기에 반복 및 수정이있을 줄의 수를 줄이기 위해 원하는 경우

은 다음과 같이 사용합니다

[a b] = split([41 42]) 
[x y z]= split(zeros(10,3), 2) % each is a 10x1 vector 
[d e] = split(zeros(2,5), 1) % each is a 1x5 vector 

그것은 여전히 ​​행렬을한다 -> 셀 -> 매트릭스 것은 생각. 당신의 벡터가 작고 루프 내에서 수백만 번하지 않는다면 괜찮을 것입니다. 당신이 정말로 원한다면 당신은 하나의 표현이를 관리 할 수 ​​있습니다

+0

감사합니다. 나는이 함수'deal'을 몰랐습니다. – Oli

4

당신은

li = [42 43 44]; 
tmp = num2cell(li); 
[a b c] = deal(tmp{:}) 

a = 
    42 
b = 
    43 
c = 
    44 
2

:

a = [1, 2, 3, 4] 
[b, c, d, e]=feval(@(x)x{:}, num2cell(a)) 

결과 : 신속 익명 함수를 만들 수있는이 많은 당신이 사용하고자하는 경우

b = 
    1 
c = 
    2 
d = 
    3 
e = 
    4 

:

expand = @(A) feval(@(x)x{:}, num2cell(A)) 
[b, c, d, e]=expand(a) 

나는 이것이 num2cell이 받아 들일만한 것, ven은 숫자 여야 만합니다. 배열 일 필요가 있습니다. Matlab의 거의 모든 것이 그 배열입니다.

관련 문제