如何在Julia中含重复索引时用sparse和full生成方阵?
解决Julia中sparse+full生成含重复索引方阵的问题
好问题!这确实是Julia里sparse函数的一个常见“小陷阱”——它默认会根据你传入的行索引的最大值来确定稀疏矩阵的行数,而不是按照你期望的方阵大小(比如索引数组的长度)来生成。不过我们有简单的方法可以调整,让full输出你想要的方阵:
方法1:显式指定稀疏矩阵的维度
sparse函数其实支持额外的参数来手动指定矩阵的行数和列数,只需要在调用时加上这两个参数即可。比如你想要生成4×4的方阵,就把行数设为4,列数设为索引数组的长度(这里是4):
i = [2, 1, 3, 3] # 第四个参数是行数,第五个是列数,显式指定为4和4 s = sparse(i, 1:length(i), 1, 4, length(i)) s_full = full(s)
这样生成的稀疏矩阵会强制保留4行,即使你的行索引里没有用到第4行,full转换后也会在最后一行填充全0,得到标准的4×4方阵。
方法2:通用化的方阵生成
如果你的索引数组长度可能变化,想要自动生成n×n的方阵(n是索引数组的长度),可以先把长度存为变量,再传入sparse:
i = [2, 1, 3, 3] n = length(i) # 行数和列数都设为n,适配任意长度的索引数组 s = sparse(i, 1:n, 1, n, n) s_full = full(s)
这种方式更灵活,不管你的i是多长,都能生成对应大小的方阵,不用手动修改数字。
为什么原来的代码会生成3×4矩阵?
简单解释下背后的逻辑:当你不指定维度时,sparse会自动推导矩阵的大小——行数取行索引数组i中的最大值(这里i的最大值是3),列数取列索引数组1:length(i)的最大值(这里是4),所以最终得到的是3×4的稀疏矩阵,full转换后自然就是这个维度啦。
另外提一句:如果你的重复索引需要累加值(比如两个3对应的位置,sparse默认会把值相加,也就是s[3,3]会是2),这个行为是正常的;如果你需要保留多个独立的1,那可能需要调整数据结构,但如果只是要保证方阵的维度,上面的两种方法就完全够用了。
内容的提问来源于stack exchange,提问作者Kadir Gunel
相关产品推荐
相关产品推荐

