带有 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)。
我想使用 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)。