我正在寻找一种通过使用GPU从Matlab中的矩阵中提取大小为m x n
的补丁的方法。通过水平和垂直移动m x n
s
个m
像素窗口来确定补丁提取的位置。
最初,我通过使用naive 2嵌套for循环解决了这个问题。但是,当我有一个较大的图片并且n
和parfor
较小时,它会变慢。因为,这个任务必须多次完成,我想提高速度。我认为这个过程可以并行完成,所以我尝试使用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
}]
}