带有arrayfun的Matlab GPU上的行最小值

时间:2017-02-24 16:56:49

标签: matlab gpu

我想找到一些计算产生的最小值的索引,比如最接近的值,使用Matlab gpuArrays。

但是,在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中时,使用#!/usr/local/bin/php -f <?php /* Create some objects */ $image = new Imagick(); $draw = new ImagickDraw(); $pixel = new ImagickPixel( 'gray' ); /* New image */ $image->newImage(400, 300, $pixel); /* Black text */ $draw->setFillColor('black'); /* Font properties */ $draw->setFontSize( 30 ); $draw->setGravity(Imagick::GRAVITY_CENTER ); /* Create text */ $image->annotateImage($draw, 0, 0, 0, "Some funky text"); /* Give image a format */ $image->setImageFormat('png'); $image->writeImage('result.png'); ?> 会正常工作,但我希望通过一个不会简化为矩阵运算的操作来实现这一点。

1 个答案:

答案 0 :(得分: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作为第三个参数。第二个参数是[]告诉MATLAB你想要min的“简化”形式,而不是min的元素形式。 (请注意,gpuArray/arrayfun仅支持min的元素形式,它解释了您所看到的错误。

根据评论中的额外信息,可能xcorr2就是你所追求的(这在GPU上运行)。