栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

从Haskell矩阵中提取对角线的最佳方法是什么?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

从Haskell矩阵中提取对角线的最佳方法是什么?

您可以将原始定义简化为:

mainDiagonal :: [[a]] -> [a]mainDiagonal []     = []mainDiagonal (x:xs) = head x : getDiagonal (map tail xs)

为此使用索引并没有多大错,这可以使您进一步简化为:

mainDiagonal xs = zipWith (!!) xs [0..]

基于数组的表示

您也可以使用由索引的Data.Array表示矩阵

(i,j)
。这使您几乎逐字使用主要对角线的数学定义:

import Data.ArraymainDiagonal :: (Ix i) => Array (i, i) e -> [e]mainDiagonal xs = [ e | ((i,j),e) <- assocs xs, i == j ]

您可以这样使用:

-- n×n matrix helpermatrix n = listArray ((0,0),(n-1,n-1))> mainDiagonal $ matrix 3 [1..][1,5,9]

效率

的先前定义

mainDiagonal
仍然无效:它仍然需要O(N²)个测试
i == j
。与
zipWith
版本类似,可以将其固定和概括如下:

mainDiagonal xs = (xs !) `map` zip [n..n'] [m..m']where ((n,m),(n',m')) = bounds xs

此版本仅索引数组O(N)次。(此外,它还适用于矩形矩阵,并且独立于索引基数。)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/367454.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号