两个数组的对应2d切片的相乘和数组切片的求逆

莱蒙德

我有两个数组,A并且B维数相同1000 x 3 x 20 x 20我想生成一个第三阵列C尺寸的3 x 3 x 20 x 20,这将是对应的切片的矩阵乘法的结果AB,即C(:,:,i,j) = A(:,:,i,j)'*B(:,:,i,j)然后,我需要通过反转相应的矩阵(即)将数组C转换为新数组同样,很清楚如何使用循环执行此操作。有没有一种方法可以使物品仿制循环D3 x 3D(:,:,i,j) = inv(C(:,:,i,j))400

编辑:比较不同解决方案性能的基准代码将是-

%// Inputs
n1 = 50;
n2 = 200;
A = rand(n1,3,n2,n2);
B = rand(n1,3,n2,n2);

%// A. CPU loopy code
tic
C = zeros(3,3,n2,n2);
for ii = 1:n2
    for jj = 1:n2
        C(:,:,ii,jj) = A(:,:,ii,jj)'*B(:,:,ii,jj); %//'
    end
end
toc

%// B. Vectorized code (using squeeze)
tic
C1 = squeeze(sum(bsxfun(@times,permute(A,[2 1 5 3 4]),permute(B,[5 1 2 3 4])),2));
toc

%// C. Vectorized code (avoiding squeeze)
tic
C2 = sum(bsxfun(@times,permute(A,[2 5 3 4 1]),permute(B,[5 2 3 4 1])),5);
toc

%// D. GPU vectorized code
tic
A = gpuArray(A);
B = gpuArray(B);
C3 = sum(bsxfun(@times,permute(A,[2 5 3 4 1]),permute(B,[5 2 3 4 1])),5);
C3 = gather(C3);
toc

运行时结果-

Elapsed time is 0.287511 seconds.
Elapsed time is 0.250663 seconds.
Elapsed time is 0.337628 seconds.
Elapsed time is 1.259207 seconds.
迪卡卡(Divakar)

代码

%// Part - 1
C = sum(bsxfun(@times,permute(A,[2 5 3 4 1]),permute(B,[5 2 3 4 1])),5);

%// Part - 2: Use MATLAB file-exchange tool multinv
D = multinv(C);

的功能代码在此处multinv可用并且声称效率很高。

对于第一部分,您还可以尝试以下操作-

C = squeeze(sum(bsxfun(@times,permute(A,[2 1 5 3 4]),permute(B,[5 1 2 3 4])),2));

这似乎是在重新排列元素,而不是上面代码中提到的那样“破坏性”,但是缺点是需要这样做squeeze可能会使它变慢一点。我会把它留给您,也鼓励您进行基准测试并选择更好的一个。


为什么bsxfun+ GPU

我增加了循环限制,因为这可能是对循环代码和矢量化代码之间的真实测试。因此,这是第1部分的修改后的代码-

%// Inputs
n1 = 50;
n2 = 200;
A = rand(n1,3,n2,n2);
B = rand(n1,3,n2,n2);

%// A. CPU loopy code
tic
C = zeros(3,3,n2,n2);
for ii = 1:n2
    for jj = 1:n2
        C(:,:,ii,jj) = A(:,:,ii,jj)'*B(:,:,ii,jj); %//'
    end
end
toc

%// B. GPU vectorized code
tic
A = gpuArray(A);
B = gpuArray(B);
C1 = sum(bsxfun(@times,permute(A,[2 5 3 4 1]),permute(B,[5 2 3 4 1])),5);
C1 = gather(C1);
toc

我的系统的运行时结果是-

Elapsed time is 0.310056 seconds.
Elapsed time is 0.172499 seconds.

所以你看!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

两个数组的对应2d切片的相乘和数组切片的求逆

来自分类Dev

根据条件切片2D numpy数组

来自分类Dev

在PHP中切片2D数组

来自分类Dev

指向切片和数组的指针

来自分类Dev

两个教派的数组切片

来自分类Dev

切片并合并 2 个数组

来自分类Dev

2D阵列切片

来自分类Dev

2D切片混乱

来自分类Dev

切片并用1d列索引数组填充2d数组

来自分类Dev

从python中的3D数组切片创建新的2D数组?

来自分类Dev

numpy.ndindex和数组切片

来自分类Dev

在numpy中获取3D数组的2D切片的平均值

来自分类Dev

过滤2D数组并将其切片为1D

来自分类Dev

基于2D数组的3D numpy切片的平均值

来自分类Dev

执行:通过切片的切片(2D切片)访问阵列时的意外性能

来自分类Dev

如何切片和扩展2D numpy数组?

来自分类Dev

如何获取numpy数组中最大的2d切片?

来自分类Dev

使用range / arange函数作为参数对2d numpy数组进行索引/切片

来自分类Dev

反转具有多个切片对象的2D NumPy数组

来自分类Dev

Numpy用索引数组对多个2D范围进行切片

来自分类Dev

Python中的2D数组切片和替换vlaues

来自分类Dev

Python 2D数组列表索引必须是整数或切片,而不是元组

来自分类Dev

在PostgreSQL中切片2d数组时行为不一致

来自分类Dev

数组切片创建新数组

来自分类Dev

数组切片以创建新数组

来自分类Dev

PHP数组切片多维数组

来自分类Dev

在Go(golang)中,如何使用一个`range`迭代两个数组,切片或地图

来自分类Dev

使用两个以上的参数基于其他数组的值切片numpy数组

来自分类Dev

数组与切片:访问速度