对称稀疏邻接矩阵中两列对应作者的共同合著者查找及代码实现
找出两位作者的共同合著者(基于稀疏对称合著矩阵)
核心思路
共同合著者是指同时与两位目标作者有合著关系的人员。对于稀疏对称矩阵A(A[i,j]=1表示i与j为合著者),只需找到满足A[i,k] = 1且A[j,k] = 1的所有索引k——利用矩阵的对称性,等价于对第i行和第j行做逻辑与运算,再提取结果中的非零元素索引。
Matlab 实现
Matlab对稀疏矩阵的逻辑运算支持良好,直接利用数组逻辑操作即可高效完成:
示例代码
% 构造示例稀疏对称合著矩阵(5位作者) A = sparse([1,1,2,3,3,4], [2,3,1,1,4,3], 1, 5, 5); A = A + A'; % 确保对称(若原始矩阵已对称可省略) % 定义函数:输入稀疏矩阵A、两位作者索引i,j,返回共同合著者索引 function coauthors = find_common_coauthors(A, i, j) % 对第i行和第j行做逻辑与,得到同时满足合著的位置 common = A(i, :) & A(j, :); % 提取非零元素的列索引(即共同合著者的ID) coauthors = find(common); % 可选:排除两位目标作者自身(若矩阵中A[i,i]可能为1时) coauthors = coauthors(coauthors ~= i & coauthors ~= j); end % 调用示例:找作者1和作者3的共同合著者 common = find_common_coauthors(A, 1, 3); disp(common); % 输出应为 [2]
说明
- 稀疏矩阵的逻辑运算
&会自动忽略零元素,计算效率远高于稠密矩阵; - 若原始矩阵已保证对称,无需执行
A = A + A'; - 若不需要排除目标作者自身,可删除过滤行。
Julia 实现
Julia的SparseArrays包提供了稀疏矩阵的完整操作支持,实现逻辑与Matlab一致:
示例代码
using SparseArrays # 构造示例稀疏对称合著矩阵(5位作者) A = sparse([1,1,2,3,3,4], [2,3,1,1,4,3], 1, 5, 5) A = A + A' # 确保对称(若原始矩阵已对称可省略) # 定义函数:输入稀疏矩阵A、两位作者索引i,j,返回共同合著者索引 function find_common_coauthors(A::SparseMatrixCSC, i::Int, j::Int) # 对第i行和第j行做逻辑与 common = A[i, :] .& A[j, :] # 提取非零元素的索引 coauthors = findall(!iszero, common) # 可选:排除两位目标作者自身 filter!(k -> k != i && k != j, coauthors) return coauthors end # 调用示例:找作者1和作者3的共同合著者 common = find_common_coauthors(A, 1, 3) println(common) # 输出应为 [2]
说明
- 使用
SparseMatrixCSC类型存储稀疏矩阵,Julia会自动优化稀疏运算; findall(!iszero, common)用于定位非零元素位置,等价于Matlab的find;- 过滤步骤同样为可选操作,按需保留。
内容的提问来源于stack exchange,提问作者Bojan Lazarevski
相关产品推荐
相关产品推荐

