【问题标题】:min of row on Matlab GPU with arrayfun带有arrayfun的Matlab GPU上的最小行数
【发布时间】:2017-07-15 14:44:13
【问题描述】:

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

【问题讨论】:

    标签: matlab gpu


    【解决方案1】:

    我对您的问题有些困惑,因为当您尝试在 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 的“缩减”形式,而不是 min 的元素形式。 (请注意,gpuArray/arrayfun 仅支持 min 的元素形式,这解释了您看到的错误)。

    根据 cmets 中的额外信息,也许 xcorr2 是您所追求的(这适用于 GPU)。

    【讨论】:

    • 谢谢!我之所以要使用arrayfun,是因为我想实现比每列与第一列之间的差异更复杂的操作。我想为每个元素找到最近匹配的 5x5 邻域,而不是显式存储它们。这有意义吗,还是我应该重新编写问题代码?
    • 它不应该是 gridsize+1,我的错。修好了。
    猜你喜欢
    • 2020-02-23
    • 2019-10-17
    • 1970-01-01
    • 2012-11-16
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多