2012-06-14 4 views
0

두 개의 다른 크기의 행렬이 있습니다. 행렬 {a}을 (1 : 10) < 10 x 1> 및 행렬 {b}을 b (6:10) < 5 x 1>로 정의합시다. for 루프 또는 동급 (bsxfun)에서 행렬 {a}와 {b}의 차이점을 얻으려면 코드가 행렬 {b}의 크기에 따라 반복됩니다. 예를 들어, 행렬 {a}의 첫 번째 값이 1이면 코드는 모든 행렬 {b} 값의 차이를 가져옵니다. 따라서 총 5 회 실행됩니다. 행렬 {a}의 다음 값은 2이고 코드는 5 번 반복됩니다. 코드는 값이 10 인 매트릭스 {a}가 끝날 때까지 반복됩니다.서로 다른 크기의 matlab 행렬 (인덱싱, for 루프 및 bsxfun)

bsxfun이없는 for 루프와 with를 모두 작성하고 값을 인덱싱 한 방법을 설명 할 수 있습니다. 또한, N 개의 행렬 (N> 2)이있는 경우, 두 행렬 대신에 덕분에 코드가 어떻게 변경 될까요?

감사합니다.

+0

a와 b를 행 벡터, 예를 들어'a = 1 : 10'과'b = 6 : 10' 또는 열 벡터,'a = [1:10] '' 'b = [1:10] ''? 다른 문제는'길이 (5:10)'는 질문에서와 같이'5'가 아니라'6'입니다. – nrz

+0

오타였습니다. 감사합니다. – Buntalan

답변

2

여기 루프 솔루션과 repmat 솔루션이 있습니다.

% 몇 가지 예제 데이터를 정의하십시오.

편집 :ab 열 벡터, 벡터를 행되지 않습니다.

a = [ 1:10 ]'; 

b = [ 6:10 ]';퍼센트 5:10 그래서 질문 6:10을 사용하는 일치하지 5 6의 수직 크기를 갖는다.

먼저, 매우 기본적인 루프 용액 모든 aIndex, bIndex쌍 통한 루프는 aIndexbIndex 의해 어드레싱 가능한 요소들의 차이를 빼고 LoopDifferenceMatrix(aIndex, bIndex)에 결과를 저장한다.

for aIndex = 1:size(a,1) 
    for bIndex = 1:size(b,1) 
     LoopDifferenceMatrix(aIndex, bIndex) = a(aIndex) - b(bIndex); 
    end 
end 

이것은 대안 repmat 해결책입니다. 수평 크기가 size(b,1) (가로 크기는 b)과 일치하도록 repmat을 사용하여 a을 가로로 복제하십시오. 그런 다음 repmat을 사용하여 세로 크기가 size(a,1) (원래 가로 크기는 a)이되도록 가로로 b을 복제합니다. 뺄셈은 복제에서 b 복제하고 결과는 DifferenceMatrix에 저장하십시오.

DifferenceMatrix = repmat(a, 1, size(b,1)) - repmat(b', size(a,1), 1); 

DifferenceMatrix = 
-5 -6 -7 -8 -9 
-4 -5 -6 -7 -8 
-3 -4 -5 -6 -7 
-2 -3 -4 -5 -6 
-1 -2 -3 -4 -5 
0 -1 -2 -3 -4 
1  0 -1 -2 -3 
2  1  0 -1 -2 
3  2  1  0 -1 
4  3  2  1  0 

isequal(DifferenceMatrix, LoopDifferenceMatrix) 
ans = 
1 
+3

'bsxfun' 솔루션은 다음과 같습니다. DifferenceMatrix = bsxfun (@ minus, a, b ')' – Jonas

+0

@nrz 감사합니다. – Buntalan

+0

@jonas bsxfun을 지적 해 주셔서 감사합니다. bsxfun은 repmat보다 훨씬 효율적입니다. – Buntalan

1

이 작업을 수행하려고하십니까?

a = 1:10; 
b = 6:10; 
c = zeros(length(b),length(a)); 
d = zeros(length(b),length(a)); 

for n = 1:length(b) 
    c(n,:) = bsxfun(@minus,a,b(n)); 
    d(n,:) = a - b(n); 
end 

N 행렬을 사용하여 수행하는 방법은 N 행렬로 수행 할 작업을 지정해야합니다.

+0

작성한 코드를 사용하면 두 행렬 대신에 세 행렬이 변경됩니다.세 번째 행렬 (e)는 (1:15) 행렬 (e)의 길이에 대해 행렬 (d)로 곱해진다. – Buntalan