如何使用Ruby交换矩阵中的列和行

rei*_*lex 4 ruby arrays matrix

所有我想要做的是交换matrix[i][j]matrix[j][i]使用while循环.为什么这不起作用?

def my_transpose(matrix)

  new_matrix = []

  i = 0
  j = 0

  while i < matrix.size
    new_matrix[i] = []
    while j < matrix.size
      new_matrix[i] << matrix[j][i]
      j += 1
    end
    i += 1
  end

  return new_matrix
end
Run Code Online (Sandbox Code Playgroud)

如果我用类似的东西运行它

[
[1,2,3],
[1,2,3],
[1,2,3]
]
Run Code Online (Sandbox Code Playgroud)

它只是回来了1,1,1.我如何让它返回1,1,1; 2,2,2; 3,3,3

Yu *_*Hao 14

如果你的问题是如何用Ruby交换矩阵中的列和行,答案是使用内置的Array#transpose

a = [
[1,2,3],
[1,2,3],
[1,2,3]
]
#=> [[1, 2, 3], [1, 2, 3], [1, 2, 3]]
a.transpose
#=> [[1, 1, 1], [2, 2, 2], [3, 3, 3]]
Run Code Online (Sandbox Code Playgroud)

  • 虽然我不想使用它...我正在尝试创建自己的. (2认同)
  • 我赞成,因为这确实是我的问题,而且这篇文章有很好的谷歌排名 (2认同)

tih*_*hom 4

在循环j = 0 内移动i

def my_transpose(matrix)

  new_matrix = []

  i = 0


  while i < matrix.size
    new_matrix[i] = []
    j = 0  # move this here
    while j < matrix.size
      new_matrix[i] << matrix[j][i]
      j += 1
    end
    i += 1
  end

  return new_matrix
end
Run Code Online (Sandbox Code Playgroud)

如果j每次循环都没有重置为 0,那么除了第一次之外,i它永远不会进入循环:j

i = 0
j = 0
# Enter i loop
 new_matrix[0] = []
 # Enter j loop
  new_matrix[0] << matrix[0][0] 
  j += 1 #=> 1

  new_matrix[0] << matrix[1][0] 
  j += 1 #=> 2

  new_matrix[0] << matrix[2][0] 
  j += 1 #=> 3
 # Exit j loop
 i += 1 #=> 1

 new_matrix[1] = []
 # Does not enter j loop as j = 3 > matrix.size
 i += 1 #=> 2

 new_matrix[2] = []
 # Does not enter j loop as j = 3 > matrix.size
 i += 1 #=> 3
# Exit i loop
Run Code Online (Sandbox Code Playgroud)