language-agnostic - 如何测试矩阵是否是对角线?

标签 language-agnostic matrix testing fortran

我需要测试一个方差矩阵是否是对角矩阵。如果没有,我将进行 Cholesky LDL 分解。但我想知道哪种最可靠和最快的测试方法是矩阵对角线?我正在使用 Fortran。

我首先想到的是对矩阵的所有元素求和,然后从该和中减去对角线元素。如果答案为 0,则矩阵是对角线的。有更好的想法吗?

我会用 Fortran 编写

!A is my matrix
k=0.0d0
do i in 1:n #n is the number of rows/colums
k = k + A(i,i)
end do

if(abs(sum(A)-k) < epsilon(k)*sum(A)) then
#do cholesky LDL, which I have to write myself, haven't found any subroutines for that  in Lapack or anywhere else
end if

最佳答案

最好只遍历所有非对角线元素并测试它们是否接近于零(比较 float 不等式很容易出现舍入错误并可能导致错误结果)。

首先,一旦发现任何违规元素,您可以立即停止遍历,如果违规矩阵是典型的,这可能会显着减少时间。

其次,它可能会允许编译器更好地展开循环(Fortran 编译器以良好的优化策略而著称),并且由于指令间依赖性较低而实现更快的片上执行。

除此之外,您建议的算法容易溢出和错误累积,而“遍历和测试”算法则不然。

关于language-agnostic - 如何测试矩阵是否是对角线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/938021/

相关文章:

algorithm - 如何有效地分割单元格中的二维空间,使每个单元格最多包含 K 个点?

encryption - 在不同编程语言之间传递加密数据的最佳实践

language-agnostic - Code Golf : Print the entire "12 Days of Christmas" song in the fewest lines of code

algorithm - 如何以最小化每个分区总和的最大值的方式对整数数组进行分区?

C++ - 矩阵类复制构造函数

python - 代码优化——Python中的函数调用次数

c - 为了传递给函数,是否值得将矩阵及其维度打包在一个结构中,或者是否可以使用额外的参数?

java - JUnit测试用@SpringApplicationConfiguration自动启动Job

ruby-on-rails - 如何将 Cucumber 测试结果保存到文件中

ruby - 理解 RSpec 中 as_null_object 的需求