Matlab에서 그림 크기를 조절하기 위해 가장 가까운 이웃 알고리즘을 구현하려고합니다. 루프를 사용하지 않고 구현하려고합니다. 매트릭스를 사용하면 성능이 크게 향상됩니다. 정말 그렇게하는 방법을 찾는 데 많은 어려움을 겪고 있습니다.매트릭스 연산, 스케일링 및 가장 가까운 이웃 (루프 없음)
- 스케일링 포토
- 계산 차원의 행렬 (
width*scale
,height*scale
)에 폭과 높이의 비율을 찾기 - 적용 각 셀에 대해 가장 가까운 이웃 인덱스를 포함한 :이 올바른 순서로해야한다고 생각 이 행렬을 시작 그림 (행렬)에 축척하여 그림을 얻으십시오.
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'
: 내가 할 경우, 나는 c
및 b
반전하고, 잘못되는 행렬을 얻는다. [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
을 계산 한 다음 진행하는 것입니다.
모든 행에 대해 하나, 모든 열에 대해 하나씩 두 벡터를 사용하여 인덱싱을 수행 할 수 있습니다. 행/열 인덱스를 별도로 계산하고 Y와 X로 말한 다음'image (Y, X)'를 수행합니다. –