如何使用GPU从图像中提取补丁

时间:2016-12-16 15:09:33

标签: matlab parallel-processing gpu

我正在寻找一种通过使用GPU从Matlab中的矩阵中提取大小为m x n的补丁的方法。通过水平和垂直移动m x n sm像素窗口来确定补丁提取的位置。

最初,我通过使用naive 2嵌套for循环解决了这个问题。但是,当我有一个较大的图片并且nparfor较小时,它会变慢。因为,这个任务必须多次完成,我想提高速度。我认为这个过程可以并行完成,所以我尝试使用arrayfun来解决问题。但是,它比正常的循环方法更慢。

现在我正在尝试使用GPU来帮助我完成这项任务。但是,目前我现在已经知道如何实现它。我检查了3 x 3,但它似乎只支持按元素计算。

那么,是否可以使用GPU来帮助解决问题?看起来它可以并行完成。

编辑:问题的一个示例

我们说我有一个A = [1 2 3 4 5 6 7 8 9]; 矩阵(我将以MATLAB格式编写矩阵)。

`

2 x 2

`

我想提取大小为`p1 = [1 2; 4 5]; p2 = [2 3; 5 6]; p3 = [4 5; 7 8]; p4 = [5 6; 8 9];` 的补丁。而且我希望每个补丁都是由1个像素移位生成的。所以,结果应该是

A = magic(3);
patchSize = [2 2];
shift = 1;

finalI = floor((size(A,1) - patchSize(1)) / shift);
finalJ = floor((size(A,2) - patchSize(2)) / shift);
patch = cell(finalI,finalJ);
for i = 0:finalI
    for j = 0:finalJ
        patch{i+1,j+1} = A(1+i*shift : patchSize(1)+i*shift, 1+j*shift : patchSize(2)+j*shift);
    end
end

以下是我在for循环方法中所做的一个例子。

case 'ADD_TO_CART':
  const index = state.findIndex(item => item.id === action.payload.id)
  if (index > -1) {
    state.splice(index, 1, {
      id: action.payload.id,
      qty: state[index].qty + action.payload.qty
    })
    return [...state]
  }
  else {
    return [...state, {
      id: action.payload.id,
      qty: newQty
    }]
  }

0 个答案:

没有答案