gpt4 book ai didi

python - 在 numpy 中,将两个结构化矩阵简洁地相乘

转载 作者:行者123 更新时间:2023-12-01 22:48:55 26 4
gpt4 key购买 nike

我有两个矩阵。第一个具有以下结构:

[[1, 0, a],
[0, 1, b],
[1, 0, c],
[0, 1, d]]

其中 10ab、 cd 是标量。矩阵是4×3

第二个只是一个 2 x 3 矩阵:

[[r1],
[r2]]

其中r1r2分别是第一行和第二行,每行有3个元素。我希望输出为:

[[r1, 0, a*r1],
[0, r1, b*r1],
[r2, 0, c*r2],
[0, r2, d*r2]]

这将是一个 4 x 9 矩阵。这类似于 Kronecker 乘积,除了第二个矩阵的每一行是分开的。当然,这可以通过我想避免的繁琐循环来完成。我怎样才能简洁地做到这一点?

最佳答案

您可以完全按照您在最后一行中所说的那样做:为第二列的每一行做一个单独的 Kronecker 乘积,然后连接结果。

假设这两个矩阵称为x(4 x 3)和y(2 x 3)。首先要做的是将 x 分成两部分,因为只有一半矩阵参与乘积的每一部分。

x = x.reshape(2, 2, 3)

然后就可以分别计算这两个乘积了:

z0 = np.kron(x[0], y[0])
z1 = np.kron(x[1], y[1])

最后,沿第一个轴连接两个结果:

z = np.concatenate([z0, z1], axis=0)

或者,如果您像我一样喜欢丑陋的大单线,您可以这样做:

z = np.concatenate([np.kron(xr, yr) for xr, yr in zip(x.reshape(2, 2, 3), y)], axis=0)

在评论中提到的一般情况下,它会变成:

z = np.concatenate([np.kron(xr, yr) for xr, yr in zip(x.reshape(int(n / 2), 2, 3), y)], axis=0)

这为显式循环提供了相同的结果,我相信它可以被 numba.jit 编译:

def solve_explicit(x, y):
# sanity checks
assert x.shape[0] == 2*y.shape[0]
assert x.shape[1] == y.shape[1]

n = x.shape[0]
z = np.zeros((n, 9))
for i in range(n):
for j in range(3):
for k in range(3):
z[i, k + 3 * j] = x[i, j] * y[int(i / 2), k]
return z

关于python - 在 numpy 中,将两个结构化矩阵简洁地相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74756281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com