Python 版本的 matlab 代码非常慢

Python version of matlab code is very slow

提问人:Zanam 提问时间:6/30/2023 最后编辑:phoZanam 更新时间:6/30/2023 访问量:77

问:

我有以下Matlab代码(我的生产代码数组大小约为):8766 x 8766

% Define z1 and z2
z1 = rand(6, 6);   % Random 6x6 matrix - real life size 8766 x 8766
z2 = rand(6, 7);   % Random 6x7 matrix - real life size 8766 x 8767

% Solve for z3
z3 = z1 \ z2; % real life size 8766 x 8767

% Display z3
disp(z3);

在 python 中等价于此:

import numpy as np
# Define z1 and z2
z1 = np.random.rand(6, 6)   # Random 6x6 matrix
z2 = np.random.rand(6, 7)   # Random 6x7 matrix
# Solve for z3 (matrix division)
z3 = np.linalg.solve(z1.T @ z1, z1.T @ z2)

但是,如果 python 版本是单数矩阵,则不起作用。即使矩阵是奇异的,Matlab 版本也可以工作。

以下替代解决方案非常缓慢:

z3 = np.linalg.pinv(z1) @ z2

那么,对我来说,解决方案是什么?

令人惊讶的是,在 2023 年,Python 仍然没有在这方面击败 Matlab。

编辑:比已经使用的方法慢scipy.linalg.lstsq

蟒蛇 matlab 线性代数 矩阵-逆 python-3.11

评论

0赞 Cris Luengo 6/30/2023
你试过scipy.linalg.lstsq吗?
2赞 Cris Luengo 6/30/2023
z3 = z1 / z2是错误的,这将是解决方案。也许你是故意的?你能展示你的计时代码吗?有了这些尺寸,就可以立即找到解决方案。也许您正在使用更大的阵列?z3 * z2 = z1z2 \ z1
0赞 Zanam 6/30/2023
@Cris是的,我的现实生活中的数组要大得多,我修复了 Z2/Z1 的情况。
1赞 Cris Luengo 6/30/2023
您的 Python 代码求解为 。您更新后的 MATLAB 代码在 中求解。如果您无法匹配操作,我们为什么要相信您的时间安排?(我不怀疑MATLAB更快,它非常擅长选择正确的算法)请发布您用于计时的代码,它将阐明您要实现的目标,并帮助我们测试可能的解决方案。z3z2 * z3 = z1z3z3 * z1 = z2
1赞 Gabriel Staples 6/30/2023
您能否对它们进行计时并添加实际的、测量的速度差异?这将是有趣的数据。

答: 暂无答案