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

min of row on Matlab GPU with arrayfun

我想使用 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 中时,它可以正常工作,但我想通过一个不简化为矩阵运算的操作来实现这一点。

我对你的问题有点困惑,因为当你在 CPU 上尝试 运行 时你的代码出错了。通过使 rows 变成 2:(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的"reduction"形式,我想跨列归约,所以需要传入2作为第三个参数。第二个参数是 [],它告诉 MATLAB 您想要 min 的 "reduction" 形式,而不是 min 的逐元素形式。 (请注意,gpuArray/arrayfun 仅支持 min 的逐元素形式,这解释了您看到的错误)。

根据评论中的额外信息,也许 xcorr2 就是您想要的(这适用于 GPU)。