2017-11-24 1 views
0

Matlab에서 그림 크기를 조절하기 위해 가장 가까운 이웃 알고리즘을 구현하려고합니다. 루프를 사용하지 않고 구현하려고합니다. 매트릭스를 사용하면 성능이 크게 향상됩니다. 정말 그렇게하는 방법을 찾는 데 많은 어려움을 겪고 있습니다.매트릭스 연산, 스케일링 및 가장 가까운 이웃 (루프 없음)

  1. 스케일링 포토
  2. 계산 차원의 행렬 (width*scale, height*scale)에 폭과 높이의 비율을 찾기
  3. 적용 각 셀에 대해 가장 가까운 이웃 인덱스를 포함한 :이 올바른 순서로해야한다고 생각 이 행렬을 시작 그림 (행렬)에 축척하여 그림을 얻으십시오.

Matlab에서 행렬과 해당 연산이 어떻게 작동하는지 혼란스러워집니다.

내가 루프가 어떻게 할 것입니다 :

x_ratio = width/(width*scale); 
y_ratio = height/(height*scale); 

for i=1:1:width 
    for j=1:1:height 
    x=i*x_ratio; 
    y=j*y_ratio; 
    out_image(i, j) = image(x, y); 
    end 
end 

지금까지 내가 매트릭스와 너무 작업을해야 찾을 관리했습니다 :

q = 
    2×2 char array 

    'ab' 
    'cd' 

>> q([1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4]) 

ans = 

    4×4 char array 

    'aabb' 
    'aabb' 
    'ccdd' 
    'ccdd' 

내 첫 번째 질문이 될 것이다 :

>> [1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4] 

ans = 

    1  1  3  3 
    1  1  3  3 
    2  2  4  4 
    2  2  4  4 

내가 좋겠 : [1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4] 올바른 결과를 생성하는 것이 그 것이다 이유는 다음과 같이 표현하는 동안에 q 전달할 올바른 행렬이 될 것이라고 생각한다

>> [1 1 2 2; 1 1 2 2; 3 3 4 4; 3 3 4 4] 

ans = 

    1  1  2  2 
    1  1  2  2 
    3  3  4  4 
    3  3  4  4 

이 경우, 모든 지수가 q 행렬에서 올바른 인덱스를 나타낸다. 그냥 그래서 ... 반 직관적 보인다

>> q([1 1 2 2; 1 1 2 2; 3 3 4 4; 3 3 4 4]) 

ans = 

    4×4 char array 

    'aacc' 
    'aacc' 
    'bbdd' 
    'bbdd' 

: 내가 할 경우, 나는 cb 반전하고, 잘못되는 행렬을 얻는다. [1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4]의 모든 세미콜론은 내가 이해하는 행 또는 수평 벡터를 나타냅니다. 그렇다면 왜 다른 행렬로 넘어갈 때 수직 벡터 또는 열을 나타내는 것일까 요? (만약 내가 완전히 눈이 멀지 않았다면,이 경우 행렬의 인덱스로 작은 행렬에 전달 된 벡터를 고려할 때 이것이 어떻게 동작 하는지를 알 수 있습니다.)

둘째, [1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4] 매트릭스는 어떻게 계산합니까? 또는 더 일반적으로, 가장 가까운 이웃 규칙에 따라 선형 인덱스의 행렬을 계산해야합니다. 즉, 중첩 루프가있는 첫 번째 코드 블록에서 수행해야합니다. 이것이 내가 생각하는 중요한 포인트이지만 매트릭스를 사용하여 프로세스를 일반화하는 방법을 알 수 없다. 루프를 사용하여 스케일 된 행렬의 각 셀을 전달하고 원래 행렬의 해당 셀을 계산합니다. 그래서, 예를 들어, 어디에 내가 scaled_matrix(i, j)을 체크해야한다면 그 셀에 orig_matrix(i*x_ratio, j*y_ratio) 등등을 넣어야한다는 것을 알 것입니다. 내 생각은 모든 올바른 인덱스를 포함하는 scaled_matrix을 계산 한 다음 진행하는 것입니다.

+0

모든 행에 대해 하나, 모든 열에 대해 하나씩 두 벡터를 사용하여 인덱싱을 수행 할 수 있습니다. 행/열 인덱스를 별도로 계산하고 Y와 X로 말한 다음'image (Y, X)'를 수행합니다. –

답변

1

첫 번째 질문에 대한 답변은 question에서 논의됩니다. Matlab은 행렬을 column-major 순서로 저장합니다.4 × 4로 q 크기 조정을위한 올바른 매트릭스가 실제로 [1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4] 아닌 다른 행렬 이유 당신의 문자 배열 q

q(1) = 'a' 
q(2) = 'c' 
q(3) = 'b' 
q(4) = 'd' 

에 대한 그래서.

두 번째 질문의 답변은 이미 "Nearest-neighbor interpolation algorithm in MATLAB"입니다. 그 게시물에 허용 대답은 당신이 원하는 모든 루프를 사용하지 않습니다.

+0

감사합니다. 필자는 열 - 주요 사건에 대해 알지 못했습니다. 그런데 왜 내가 [1 1 3 3; 1 1 3 3; 2 2 4 4; 2 2 4 4]'와 같이,'[1 1 3 3]'이 칼럼처럼 인쇄되지는 않지만 (예제에서와 같이) 행이 인쇄됩니까? 또한, 메모리의 변수를 보면,'[1 1 3 3]'은 행이 아니라 열임을 알 수 있습니다. 이것은 선형 인덱싱 계산이 관련되어있을 때'[1 1 3 3]'이 열로 간주된다는 것을 의미합니까? – Dodicin

+0

두 번째 질문에 대해서는 OP에 자세한 내용을 추가했습니다. Kronecker Tensor 제품에 대해 더 잘 알려 드리겠습니다. – Dodicin

+0

정확합니다. 선형 인덱싱을 처리 할 때만 열 - 주 메모리 레이아웃을 의식해야합니다. –