2012-06-15 3 views
1

점수 시스템에서 수행 할 작은 프로젝트가 있습니다. 나는 그것을 조작하기 위해 엑셀을 사용한다면 확실히 많은 시간을 필요로한다는 것을 알았다. 내가 너희들에게 도움이되기를 바란다. Z에있을 것이다 (단 2) 각각의 B (: 단 1), Z (1 단), 각 A는 Z가됩니다전체 행렬을 단 하나의 열로 정렬

A = [10 20 30 40 ...]  % (1xm array) 
B = [0.02; 0.04;...]  % (nx1 array) 
F = A/B      % F should be (n x m matrix) 
Z = zero (size(nxm), 3)  % I'm trying to create a matrix with n x m row and 3 column) 

I는 Z로 F를 정렬하고자하는 (3 단) . Matlab에 어떻게 써야 하나?

예 : 여기

 10  20 30 40 50 ... 
0.02 500  1000 1500 2000 2500 
0.04 250  500 750 1000 1250 
0.06 166.67 333.33 500 666.67 833.33 
... 

출력 Z

166.67 10 0.06 
250  10 0.04 
333.33 20 0.06 
.... 

희망의 사람이 나에게 도움이 될 수 있습니다. 감사.

답변

1

찾고있는 것은 meshgrid 또는 bsxfun입니다. meshgrid 솔루션 :

A=[10 20 30 40]; 
B=[0.02 0.04 0.06 0.08]; 
[x,y]=meshgrid(A,B); % Generate 2 matrices having the elements to divide 
F=x./y;    % Do elemnt-by-element divide 
Z=[F(:),x(:),y(:)]; % put all values from the matrices together as columns, 
        % using linear indexing (:). 

bsxfun 솔루션은보다 빠르고 컴팩트 미만 읽을 수는 :

F=bsxfun(@rdivide,A',B); % Put the transpose at B if you want it 
         % sorted along B. 
x=bsxfun(@times,A,ones(size(B,2),1)); % a matric containing A as columns 
y=bsxfun(@times,ones(1,size(A,2)),B'); % a matrix containing B repeated as rows 
Z=[F(:),x(:),y(:)]; 

bsxfun와 트릭은 싱글 확장을 수행한다는 것이다. 입력은 두 번째 피연산자와 일치하는 데 필요한만큼 길이가 1 인 각 차원을 따라 반복됩니다.

은 그래서 당신이 (의사 코드)를 가지고 위의 4 × 4의 경우 : 당신이 그것을으로 분류 한 할 것

[10 20 30 40; [0.01 0.01 0.01 0.01; 
10 20 30 40; .* 0.02 0.02 0.02 0.02; 
10 20 30 40;  0.04 0.04 0.04 0.04; 
10 20 30 40]  0.06 0.06 0.06 0.06] 

:

[10 20 30 40] .* [0.01; 
        0.02; 
        0.04; 
        0.06] 

은 (또한 의사 코드)로 확대됩니다 F : 사용하여 쉽게 수행 할 수 있습니다

Z_sort = sortrows(Z,[1]); 
+0

적어도 MATLAB R2012a 'F = bsxfun에서 (

입력 데이터 (A이다 행 벡터가 B 컬럼 벡터이다) @bidxfun (@ rdivide, A, B ')로 변경'undefined function'은 'double'형의 입력 인자를 '나누기'합니다. 문제. – nrz

+0

당신은 완전히 옳았습니다. 감사. – jpjacobs

+0

@jpjacobs, 귀하의 의견에 감사드립니다. F = B/A 대신 F = A/B를 사용하여 질문을 편집했습니다. 나는 F = x. \ y를 바꾼다. 오류가있다. 그러나 F = x./y (A와 B는 같은 크기 여야 함). A와 B는 같은 크기가 어때요? –

1

이것은 reshape 및 선형을 사용하는 해결책입니다. 주소 : 여기

A = [ 10, 20, 30, 40 ]; 
B = [ 0.02; 0.04; 0.06; 0.08 ]; 

코드있어 :

F = bsxfun(@rdivide, A, B); 
Fvector = reshape(F, 1, numel(F)); 

[SortedFvector, IX] = sort(Fvector); 
Aindices = ceil(IX/size(B, 1)); 

Bindices = mod(IX, size(B, 1)); 
Bindices(Bindices == 0) = size(B, 1); 

Z = [ SortedFvector', A(Aindices)', B(Bindices) ]; 
+0

감사합니다. 방금 편집 한 함수 F = B/A에서 A/B로. 그러나 코드를 복사하여 붙여 넣기 만하면 출력이 조금 이상합니다.그 후에 나는 ldivide로 rdivide, SortedFvector는 0.002 (0.02/10)의 독서를 줘. SortedFvector에서 500 (10/0.02)의 수치를 알려주고 싶다면 어떻게 진행해야할까요? –

+0

내 솔루션은 선형 주소 지정과 함께 작동하므로 이러한 모든 주소는 선형 (1 차원)입니다. '500'의 선형 주소를 얻으려면 먼저 선형 색인을 다음과 같이 얻습니다 :'IX = find (Fvector == 500)'그리고 나서 코드 에서처럼'Aindices'와'Bindices'로 변환하십시오. 그러나 '500'이 모든 대각선 요소에 나타나며 이렇게하면 모두 얻을 수 있습니다. 코드와 같은 명령을 사용하여'Andices'와'Bindices '를 얻으면'Avalue = A (Aindices (1))'(당신은'10'을 얻음)와'Bvalue = B (Bindices (1))' (당신은'0.02'을 얻어야합니다). – nrz

+0

나는 여전히 정확한 F를 얻을 수 없다. 나는 단지 10/0.02 대신 0.02/F에서 F의 답을 얻을 수있다 ... –

관련 문제