生成±1矩阵后,二维数组唯一相邻元素对乘积求和实现咨询
计算20×20±1矩阵的唯一相邻元素对乘积之和
嘿,看起来你已经搞定了第一步的随机矩阵生成,接下来的相邻对乘积求和其实可以用更简洁的方式实现,我来帮你梳理一下思路和代码实现:
问题回顾
- 已成功生成随机填充1和-1元素的20×20矩阵
- 核心目标:计算所有唯一相邻元素对的乘积之和,再乘以系数
D,理论结果范围为0到800D(注:如果是无重复的相邻对,实际总和范围是-760到760,乘以D后对应-760D到760D,推测你指的是绝对值范围或统计逻辑有微调,下面先按无重复的唯一对来实现) - 当前你尝试的思路:通过创建22×22的扩展矩阵来处理边缘元素的索引问题,这个思路是可行的,不过我们可以优化遍历逻辑,避免重复计算相邻对。
实现方案(以Python为例)
1. 生成初始矩阵
用numpy快速生成20×20的±1随机矩阵:
import numpy as np # 生成20×20的随机±1矩阵 original_matrix = np.random.choice([1, -1], size=(20, 20))
2. 计算唯一相邻对乘积之和
为了保证“唯一”,我们只遍历每个元素时计算它右侧和下侧的相邻元素乘积——这样每个相邻对只会被计算一次,不会重复统计:
sum_products = 0 rows, cols = original_matrix.shape # 遍历所有元素,计算右侧和下侧的相邻乘积 for i in range(rows): for j in range(cols): # 计算右侧相邻对(避免超出矩阵范围) if j < cols - 1: sum_products += original_matrix[i][j] * original_matrix[i][j+1] # 计算下侧相邻对(避免超出矩阵范围) if i < rows - 1: sum_products += original_matrix[i][j] * original_matrix[i+1][j] # 计算最终结果 final_result = sum_products * D
3. 扩展矩阵版本实现(对应你的初始思路)
如果你坚持要用22×22扩展矩阵的方式,也可以这样写,注意要避开填充边缘的无效相邻对:
# 创建22×22的扩展矩阵,边缘填充原矩阵的边缘元素 extended_matrix = np.pad(original_matrix, pad_width=1, mode='edge') sum_products = 0 # 遍历原矩阵对应的位置(扩展矩阵的1~20行,1~20列) for i in range(1, 21): for j in range(1, 21): # 右侧相邻对(对应原矩阵的(i-1,j)和(i-1,j+1)) sum_products += extended_matrix[i][j] * extended_matrix[i][j+1] # 下侧相邻对(对应原矩阵的(i-1,j)和(i,j)) sum_products += extended_matrix[i][j] * extended_matrix[i+1][j] final_result = sum_products * D
结果验证
20×20矩阵的唯一相邻对总数是:
- 横向相邻对:20行 × 19对/行 = 380个
- 纵向相邻对:20列 × 19对/列 = 380个
- 总计:760个唯一相邻对
每个乘积的结果是1(两个元素相同)或-1(两个元素不同),所以sum_products的范围是-760到760,乘以D后结果范围是-760D到760D。如果你的理论范围是0到800D,可以对结果取绝对值,或者调整统计逻辑为包含重复计数(但这样总数会翻倍,范围也会扩大)。
内容的提问来源于stack exchange,提问作者Eddie.Campana
相关产品推荐
相关产品推荐

