小编Mik*_*erg的帖子

矢量化和嵌套矩阵乘法

这是原始代码:

K = zeros(N*N)
for a=1:N
    for i=1:I
        for j=1:J
            M = kron(X(:,:,a).',Y(:,:,a,i,j));

            %A function that essentially adds M to K. 
        end
    end
end
Run Code Online (Sandbox Code Playgroud)

目标是向量化kroniker乘法调用.我的直觉是将X和Y视为矩阵的容器(作为参考,X和Y的切片被馈送到kron是7x7阶的矩阵).在此容器方案下,X显示为1-D容器,Y显示为3-D容器.我的下一个猜测是将Y重塑为2-D容器或更好的1-D容器,然后进行X和Y的元素乘法.问题是:如何以保留M和M的轨迹的方式重塑matlab甚至可以在这个容器构思中处理这个想法,还是需要进一步重塑容器以进一步暴露内部矩阵元素?

matlab vectorization matrix-multiplication

3
推荐指数
1
解决办法
471
查看次数

使用排列在Python中进行广播

我理解,transpose在一个ndarray意图是相当于matlab的permute功能,但我有一个不起作用的特定用例.在matlab中我有以下内容:

C = @bsxfun(@times, permute(A,[4,2,5,1,3]), permute(B, [1,6,2,7,3,4,5])
Run Code Online (Sandbox Code Playgroud)

其中A是形状为NxNxM的3D张量,B是形状为NxNxMxPxP的5D张量.上述功能旨在对循环kronecker产品进行矢量化.我假设Matlab为A和B添加了2个单独的维度,这就是为什么它能够重新排列它们.我希望将此代码移植到Python,但我不认为它具有添加这些额外维度的能力..我发现成功地增加了额外的尺寸,但是广播不是同样的matlab bsxfun.我试过了明显的翻译(是的,我正在使用numpy来实现这些ndarray和功能):

A = A[...,None,None]
B = B[...,None,None]
C = transpose(A,[3,1,4,0,2])*transpose(B,[0,5,1,6,2,3,4])
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

return transpose(axes)
ValueError: axes don't match array
Run Code Online (Sandbox Code Playgroud)

我的第一个猜测是reshape在A和B上添加这些单例维度?

我现在收到以下错误:

mults = transpose(rho_in,[3,1,4,0,2])*transpose(proj,[0,5,1,6,2,3,4])
ValueError: operands could not be broadcast together with shapes (1,9,1,9,8) (9,1,9,1,8,40,40)
Run Code Online (Sandbox Code Playgroud)

编辑:修改我的问题是减少添加单例维度,但更多关于在python中正确地广播这个matlab乘法.

python matlab vectorization broadcasting permute

3
推荐指数
1
解决办法
211
查看次数