制作n维矩阵ruby方法
Making an n-dimensional matrix ruby method
首先,让我说我是 Ruby 的新手,我听说过 NArray,但我想看看我是否可以尝试解决这个问题(在你们好人的帮助下)
我了解到我可以做这样的事情:
a=Array.new(2){Array.new(2){Array.new(2,5)}}
=>[[[5, 5], [5, 5]], [[5, 5], [5, 5]]]
来自 Ruby multidimensional array
我尝试制作一个通用函数,可以将任何变量作为维度,并用一个值填充 n 维数组:
def get_n_dimensional(*args, value)
myarr= Array.new(args[-1],value)
args.reverse.drop(1).each{ |arg| myarr=Array.new(arg){myarr}}
return myarr
end
a = get_n_dimensional(2,2,2,value=5)
puts a.inspect
=> [[[5, 5], [5, 5]], [[5, 5], [5, 5]]]
但我可以看到递归引用同一个数组是如何导致问题的:
a[0][1][1]=100
puts a.inspect
=> [[[5, 5], [5, 100]], [[5, 5], [5, 100]]]
我想知道我可以用来解决这个问题的其他策略。我正在考虑构建一个字符串(循环取决于输入维度)并在我的函数中对其进行评估,例如:
eval("Array.new(args[0]){Array.new(args[1]){Array.new(args[2],value)}}"
我想我的部分问题是是否可以像这样依赖 eval
这也是我第一次 post 关于 SO...如果我搞砸了请告诉我
这需要递归方法。
def make_nested_array(*dim, v)
d, *rest = dim
Array.new(d) { rest.empty? ? v : make_nested_array(*rest, v) }
end
a = make_nested_array(2,3,4,'hi')
#=> [
# [
# ["hi", "hi", "hi", "hi"], ["hi", "hi", "hi", "hi"], ["hi", "hi", "hi", "hi"]
# ],
# [
# ["hi", "hi", "hi", "hi"], ["hi", "hi", "hi", "hi"], ["hi", "hi", "hi", "hi"]
# ]
# ]
为了证明没有两个 object_id
是相同的,我们只更改一个元素。
a[1,1,1] = 'cat'
a.flatten
#=> ["hi", "hi", "hi", "hi", "hi", "hi", "hi", "hi", "hi", "hi", "hi", "hi",
# "hi", "hi", "hi", "hi", "hi", "cat", "hi", "hi", "hi", "hi", "hi", "hi"]
首先,让我说我是 Ruby 的新手,我听说过 NArray,但我想看看我是否可以尝试解决这个问题(在你们好人的帮助下)
我了解到我可以做这样的事情:
a=Array.new(2){Array.new(2){Array.new(2,5)}}
=>[[[5, 5], [5, 5]], [[5, 5], [5, 5]]]
来自 Ruby multidimensional array
我尝试制作一个通用函数,可以将任何变量作为维度,并用一个值填充 n 维数组:
def get_n_dimensional(*args, value)
myarr= Array.new(args[-1],value)
args.reverse.drop(1).each{ |arg| myarr=Array.new(arg){myarr}}
return myarr
end
a = get_n_dimensional(2,2,2,value=5)
puts a.inspect
=> [[[5, 5], [5, 5]], [[5, 5], [5, 5]]]
但我可以看到递归引用同一个数组是如何导致问题的:
a[0][1][1]=100
puts a.inspect
=> [[[5, 5], [5, 100]], [[5, 5], [5, 100]]]
我想知道我可以用来解决这个问题的其他策略。我正在考虑构建一个字符串(循环取决于输入维度)并在我的函数中对其进行评估,例如:
eval("Array.new(args[0]){Array.new(args[1]){Array.new(args[2],value)}}"
我想我的部分问题是是否可以像这样依赖 eval
这也是我第一次 post 关于 SO...如果我搞砸了请告诉我
这需要递归方法。
def make_nested_array(*dim, v)
d, *rest = dim
Array.new(d) { rest.empty? ? v : make_nested_array(*rest, v) }
end
a = make_nested_array(2,3,4,'hi')
#=> [
# [
# ["hi", "hi", "hi", "hi"], ["hi", "hi", "hi", "hi"], ["hi", "hi", "hi", "hi"]
# ],
# [
# ["hi", "hi", "hi", "hi"], ["hi", "hi", "hi", "hi"], ["hi", "hi", "hi", "hi"]
# ]
# ]
为了证明没有两个 object_id
是相同的,我们只更改一个元素。
a[1,1,1] = 'cat'
a.flatten
#=> ["hi", "hi", "hi", "hi", "hi", "hi", "hi", "hi", "hi", "hi", "hi", "hi",
# "hi", "hi", "hi", "hi", "hi", "cat", "hi", "hi", "hi", "hi", "hi", "hi"]