基于矩阵替换字符串表达式中的值并遍历列。

huangapple go评论108阅读模式
英文:

Replacing values in a string expression based on a matrix and iterating over columns

问题

在列X中,将有每一列j中的值的变量,这种情况下只有U1X4U2有值,属于列表['B', 'X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2']的其余变量都将具有值0

  1. # 示例矩阵
  2. new_matrix = [['C', 'X', 'B', 'X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2'],
  3. [0.0, 'U1', 8, 2.0, 1.0, -1.0, 0, 0, 1.0, 0],
  4. ['+M', 'X4', 2, 1.0, 1.0, 0, 1.0, 0, 0, 0],
  5. ['+M', 'U2', 8, 1.0, 2.0, 0, 0, -1.0, 0, 1.0]]
  6. variables = ['X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2', 'B'] # 选择第一行(只有变量)
  7. variables_j_col_values = [['B', 'X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2'], []] # --> ['B', 'X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2']

问题是我需要创建以下变量的值矩阵(不使用库),其中我会有以下内容:

  1. variables_j_col_values = [['B', 'X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2'],
  2. [0, 0, 0, 0, 2, 0, 8, 8], #列 new_matrix[][2]
  3. [0, 0, 0, 0, 1.0, 0, 2.0, 1.0], #列 new_matrix[][3]
  4. [0, 0, 0, 0, 1.0, 0, 1.0, 2.0], #列 new_matrix[][4]
  5. [0, 0, 0, 0, 0, 0, -1.0, 0], #列 new_matrix[][5]
  6. [0, 0, 0, 0, 1.0, 0, 0, 0], #列 new_matrix[][6]
  7. [0, 0, 0, 0, 0, 0, 0, -1.0], #列 new_matrix[][7]
  8. [0, 0, 0, 0, 0, 0, 1.0, 0], #列 new_matrix[][8]
  9. [0, 0, 0, 0, 0, 0, 0, 1.0], ] #列 new_matrix[][9]

创建了variables_j_col_values后,继续替换funcion_obj_z字符串中的行值(除了variables_j_col_values数组的第0行,因为它是标题)。逻辑是使用循环遍历行,并执行.replace(new_matrix[][n], this_element)

  1. funcion_obj_z = 'Z = 3 * X1 + 2 * X2 + 0 * X3 + 0 * X4 + 0 * X5 + M * U1 + M * U2'

这样,如果在每个j迭代中打印j_func的值,则会在控制台中获得以下所需的正确输出

  1. # 对于循环,打印替换字符串中的 j 值
  2. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 2 + 0 * 0 + M * 8 + M * 8' # 迭代 1
  3. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 1.0 + 0 * 0 + M * 2.0 + M * 1.0' # 迭代 2
  4. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 1.0 + 0 * 0 + M * 1.0 + M * 2.0' # 迭代 3
  5. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 0 + 0 * 0 + M * -1.0 + M * 0' # 迭代 4
  6. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 1.0 + 0 * 0 + M * 0 + M * 0' # 迭代 5
  7. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 0 + 0 * 0 + M * 0 + M * -1.0' # 迭代 6
  8. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 0 + 0 * 0 + M * 1.0 + M * 0' # 迭代 7
  9. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 0 + 0 * 0 + M * 0 + M * 1.0' # 迭代 8
英文:

In column X are those variables that will have values in each column j, in this case only U1, X4 and U2 have values, the rest of the variables belonging to the list ['B', 'X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2'] will all have their values 0

  1. #example matrix
  2. new_matrix = [[ 'C', 'X', 'B', 'X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2'],
  3. [ 0.0, 'U1', 8, 2.0, 1.0, -1.0, 0, 0, 1.0, 0],
  4. ['+M', 'X4', 2, 1.0, 1.0, 0, 1.0, 0, 0, 0],
  5. ['+M', 'U2', 8, 1.0, 2.0, 0, 0, -1.0, 0, 1.0]]
  6. variables = ['X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2', 'B'] #select the first row (only variables)
  7. variables_j_col_values = [[variables.pop(variables.index('B'))] + variables, []] # --> ['B', 'X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2']

The problem with this is that I need create the following matrix of values of the variables (without using libraries) where I would have the following:

  1. variables_j_col_values = [['B', 'X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2'],
  2. [ 0 , 0, 0, 0, 2, 0, 8, 8], #column new_matrix[][2]
  3. [ 0 , 0, 0, 0, 1.0, 0, 2.0, 1.0], #column new_matrix[][3]
  4. [ 0 , 0, 0, 0, 1.0, 0, 1.0, 2.0], #column new_matrix[][4]
  5. [ 0 , 0, 0, 0, 0, 0, -1.0, 0], #column new_matrix[][5]
  6. [ 0 , 0, 0, 0, 1.0, 0, 0, 0], #column new_matrix[][6]
  7. [ 0 , 0, 0, 0, 0, 0, 0, -1.0], #column new_matrix[][7]
  8. [ 0 , 0, 0, 0, 0, 0, 1.0, 0], #column new_matrix[][8]
  9. [ 0 , 0, 0, 0, 0, 0, 0, 1.0], ] #column new_matrix[][9]

After create the variables_j_col_values, go replacing the values of the rows (except for row 0 of the variables_j_col_values array because it is a header) in the string inside funcion_obj_z
The logic would be to use a loop that goes through the rows, and does a
.replace(new_matrix[][n], this_element)

  1. funcion_obj_z = 'Z = 3 * X1 + 2 * X2 + 0 * X3 + 0 * X4 + 0 * X5 + M * U1 + M * U2'

In this way, using said string as an expression, it would obtain these prints in the console if it printed the value of j_func in each j iteration. These would be the desired correct output:

  1. #for loop, print the j string replacement the values in the string
  2. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 2 + 0 * 0 + M * 8 + M * 8' #iteration 1
  3. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 1.0 + 0 * 0 + M * 2.0 + M * 1.0' #iteration 2
  4. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 1.0 + 0 * 0 + M * 1.0 + M * 2.0' #iteration 3
  5. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 0 + 0 * 0 + M * -1.0 + M * 0' #iteration 4
  6. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 1.0 + 0 * 0 + M * 0 + M * 0' #iteration 5
  7. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 0 + 0 * 0 + M * 0 + M * -1.0' #iteration 6
  8. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 0 + 0 * 0 + M * 1.0 + M * 0' #iteration 7
  9. j_func = 'Z = 3 * 0 + 2 * 0 + 0 * 0 + 0 * 0 + 0 * 0 + M * 0 + M * 1.0' #iteration 8

答案1

得分: 0

尽管这个解决方案不够美观,但它应该为您提供所需的转换:

  1. new_matrix = [['C', 'X', 'B', 'X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2'],
  2. [0.0, 'U1', 8, 2.0, 1.0, -1.0, 0, 0, 1.0, 0],
  3. ['+M', 'X4', 2, 1.0, 1.0, 0, 1.0, 0, 0, 0],
  4. ['+M', 'U2', 8, 1.0, 2.0, 0, 0, -1.0, 0, 1.0]]
  5. variables = ['X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2', 'B']
  6. # 创建一个空矩阵
  7. variables_j_col_values = [[0 for _ in range(len(variables))] for _ in range(len(new_matrix[0])-1)]
  8. # 根据new_matrix的标头替换第一行的变量
  9. variables_j_col_values[0] = sorted(variables, key=lambda x: new_matrix[0].index(x))
  10. # 循环遍历所有值行
  11. for row in new_matrix[1:]:
  12. # 根据variables_j_col_values的第一行获取正确的列
  13. col = variables_j_col_values[0].index(row[1])
  14. # 将值和行进行配对并进行相应的更新
  15. for val, target in zip(row[2:], variables_j_col_values[1:]):
  16. target[col] = val
英文:

Albeit an ugly solution, this should give you the transformation you need:

  1. new_matrix = [[ 'C', 'X', 'B', 'X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2'],
  2. [ 0.0, 'U1', 8, 2.0, 1.0, -1.0, 0, 0, 1.0, 0],
  3. ['+M', 'X4', 2, 1.0, 1.0, 0, 1.0, 0, 0, 0],
  4. ['+M', 'U2', 8, 1.0, 2.0, 0, 0, -1.0, 0, 1.0]]
  5. variables = ['X1', 'X2', 'X3', 'X4', 'X5', 'U1', 'U2', 'B']
  6. # create empty matrix
  7. variables_j_col_values = [[0 for _ in range(len(variables))] for _ in range(len(new_matrix[0])-1)]
  8. # replace first row with sorted variables based on new_matrix headers
  9. variables_j_col_values[0] = sorted(variables, key=lambda x: new_matrix[0].index(x))
  10. # loop over all value rows
  11. for row in new_matrix[1:]
  12. # get correct column in variables_j_col_values based
  13. col = variables_j_col_values[0].index(row[1])
  14. # zip the values and rows and update accordingly
  15. for val, target in zip(row[2:], variables_j_col_values[1:]):
  16. target[col] = val

huangapple
  • 本文由 发表于 2023年6月2日 03:33:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/76385151.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定