gpt4 book ai didi

ruby - 检查 Ruby 数组是否为矩阵的简单方法?

转载 作者:太空宇宙 更新时间:2023-11-03 17:04:43 24 4
gpt4 key购买 nike

我正在从事一个项目,该项目涉及检查输入是否为 n 维矩阵(并找到其维度),如果不是则引发错误。例如

arr = [ [[1,2],[3,4]], [[5,6],[7,8]], [[9,10],[11,12]] ]

是维度 [3 2 2] 的矩阵。最简单的通用方法是什么?

最佳答案

递归解决方案,但不太容易理解。

arr1 = [[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]]
arr2 = [[[1, 2], [4]], [6, [7, 8]]]

def dimensions(m)
if m.any? { |e| e.is_a?(Array) }
d = m.group_by { |e| e.is_a?(Array) && dimensions(e) }.keys
[m.size] + d.first if d.size == 1 && d.first
else
[m.size]
end
end

dimensions(arr1) #=> [3, 2, 2]
dimensions(arr2) #=> nil

解释

算法首先检查嵌套数组,m.any? { |e| e.is_a?(数组)。如果没有嵌套数组,那么你只有一个维度,它通过 else block 中的 [m.size] 返回给定数组的大小。

dimensions([1,2,3])  #=> [3]

如果至少有一个嵌套数组,那么您必须确保所有元素都是数组并且数组具有相同的维度。此检查通过 d = m.group_by { |e| 完成e.is_a?(Array) && dimensions(e) }.keys 按维度对所有元素进行分组。

[[5, 6], [7, 8]].group_by { |e| ... }.keys
#=> [[2]], all nested array dimensions are equal [2]
[[1, 2], [4]].group_by { |e| ... }.keys
#=> [[1], [2]], different dimensions
[6, [7, 8]].group_by { |e| ... }.keys
#=> [false, [2]], an element isn't an array

该算法仅采用 group_byif d.size == 1 && d.first 的有效结果,并将嵌套数组的维度添加到结果中通过 [m.size] + d.first。如果有多个键元素或只有 nil,这意味着所有嵌套数组均无效,则它会隐式返回 nil

就这些。

关于ruby - 检查 Ruby 数组是否为矩阵的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37873126/

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