我想找到一些计算产生的最小值的索引,比如最接近的值,使用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');
?>
会正常工作,但我希望通过一个不会简化为矩阵运算的操作来实现这一点。
答案 0 :(得分: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
的“简化”形式,我想减少列数,所以我需要传递2
作为第三个参数。第二个参数是[]
告诉MATLAB你想要min
的“简化”形式,而不是min
的元素形式。 (请注意,gpuArray/arrayfun
仅支持min
的元素形式,它解释了您所看到的错误。
根据评论中的额外信息,可能xcorr2
就是你所追求的(这在GPU上运行)。