2017-02-24 32 views
2

Matlab gpuArraysを使用して、最も近い値のような計算結果の最小値のインデックスを探したいと思います。Arrayfunを使用したMatlab GPUの行

しかし、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) 

これを達成する方法はありますが、次のコードで

?私はmin(gpuArray)を使用することは、arrayfunにないときは正常に動作することを知っていますが、私は行列操作に単純化しない操作でこれを実現したいと思います。

答えて

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の「削減」フォームを使用している、と私は列にわたって削減したいので、私は3番目の引数として2に渡す必要があります。 2番目の引数は[]で、要素型の形式ではなくminではなく、 "reduced"形式のminがMATLABに必要です。 (gpuArray/arrayfunは、表示されているエラーを説明する要素型のフォームminのみをサポートしています)。

コメントの余分な情報に基づいて、おそらくxcorr2があなたの後ろにあります(これはGPUで動作します)。

+0

ありがとうございました!私がarrayfunを使いたいのは、最初の列と各列の違いよりも複雑な操作をしたいからです。私は、明示的にそれらを格納せずに、各要素の最も近い一致する5x5近傍を見つけたいと思います。それは意味をなさないでしょうか、あるいは私は質問コードを改訂するべきですか? – MrMartin

+0

グリッドサイズ+1であってはなりません。修正しました。 – MrMartin

関連する問題