2017-02-24 1 views
2

Matlab gpuArrays를 사용하여 가장 가까운 값과 같은 일부 계산 결과로 가장 작은 값의 인덱스를 찾고 싶습니다.Matlab GPU에서 arrayfun을 사용하는 행

그러나 arrayfun 시나리오에서 min 함수는 기능을 제공하지 않는 것 같습니다.

function grid_gpu_test 
    gridSize = 8; 
    grid = gpuArray(rand(gridSize)); 

    all_c=1:gridSize; % because : is not supported 

    function X = min_diff(row) 
     X = min(abs(grid(row,all_c)-grid(row,1))) 
    end 

    rows = gpuArray.colon(2, gridSize)'; 
    arrayfun(@min_diff, rows) 
end 

나는 다음과 같은 오류 얻을 :

Too few input arguments supplied to: 'min'. Error in 'grid_gpu_test' (line: 9) 

이를 달성 할 수있는 방법이 있나요를 다음 코드로

? 나는 그것이 arrayfun에 없을 때 min(gpuArray)을 사용할 때 정상적으로 작동한다는 것을 알고 있지만 행렬 작업으로 단순화하지 않는 작업으로이 작업을 수행하려고합니다.

답변

1

CPU에서 실행하려고하면 코드 오류가 발생하기 때문에 질문에 약간 혼란 스럽습니다. rows2:(gridSize+1)으로 지정하면 grid 크기를 초과합니다.

어쨌든 arrayfun보다는 여기에 bsxfun (또는 R2016b 이상이있는 경우 암시 적 확장)을 사용하고 싶습니다. 다음은 bsxfun 버전입니다. 여기

grid = gpuArray.rand(8); 
% I think what you're trying to compute is the difference 
% between each column of "grid" compared to the first column 
difference = bsxfun(@minus, grid(:,1), grid); 
% To find the minimum difference, and its column, use 
% the following form of MIN 
[val, col] = min(difference, [], 2) 

나는 min의 "감소"양식을 사용하고, 나는 열을 통해 줄이고 자, 그래서 세 번째 인수로 2에 전달해야합니다. 두 번째 인수는 []이며, 요소 형식의 양식 인 min이 아니라 min의 "축소"형식을 MATLAB에 알리십시오. gpuArray/arrayfun은 요소 유형 양식 min 만 지원하며 표시되는 오류를 설명합니다.

덧글의 추가 정보를 바탕으로 아마 xcorr2 (이 내용은 GPU에서 작동합니다)입니다.

+0

고맙습니다! arrayfun을 사용하려는 이유는 첫 번째 열과 각 열의 차이보다 복잡한 연산을 수행하기 위해서입니다. 나는 명시 적으로 저장하지 않고 각 요소에 가장 가까운 5x5 이웃을 찾고 싶다. 그게 의미가 있습니까, 아니면 내가 질문 코드를 재조정해야합니까? – MrMartin

+0

gridsize + 1이 아니어야합니다. 고쳤다. – MrMartin