A是n * n上三角矩阵,x是n * 1向量,有没有更快的方法在matlab中做Ax比A满,因为它应该需要n *(n + 1)/ 2次乘法而不是n ^ 2次乘法。 谢谢!
答案 0 :(得分:1)
我认为你不能提高性能,因为使用零的任何解决方案都会增加很多开销。提高性能的第一个想法是排除仅包含零的四分之一,我使用此函数执行此操作:
@(x,y)[x(1:end/2,1:end/2)*y(1:end/2);x(end/2+1:end,:)*y]
这样就可以跳过50%的乘以零。
并将其与标准方式进行比较:
@(x,y)(x*y)
使用随机输入数据:
@(n)triu(rand(n))
@(n)rand(n,1)
结果显示简单的乘法更快。
执行时间(平均值)
@(x,y)(x*y) @(x,y)[x(1:end/2,1:end/2)*y(1:end/2);x(end/2+1:end,:)*y]
2 0.000015 0.000027
10 0.000015 0.000028
100 0.000023 0.000041
1000 0.000454 0.003433
2000 0.003002 0.014185
3000 0.006505 0.032233
4000 0.011401 0.057172
5000 0.018567 0.089489
10000 0.076099 0.351794
总而言之,您正在进行50%无用的计算,但使用MATLAB非常有效地实现矩阵乘法。这可能是最好的选择。