我想在特征中缩小稀疏基质的行和列.这是我拥有的代码,但不起作用. #include #include #include typedef Eigen::SparseMatrix SpMat; using namespace Eigen; using namespace std; int myrandom (int i) { return std::rand()%i;} int main() { PermutationMatrix perm(5); MatrixXd x = MatrixXd::Random(5,5); SpMat y = x.sparseView(); int dim=5; perm.setIdentity(); for (int i=dim-1; i>0; --i) {
以下是关于 sparse-matrix 的编程技术问答
最小化瓷砖重新排序问题: 假设我具有以下对称的9x9矩阵,n粒子之间的n^2相互作用: (1,2) (2,9) (4,5) (4,6) (5,8) (7,8), 这些是对称的相互作用,因此隐含地暗示存在: (2,1) (9,2) (5,4) (6,4) (8,5) (8,7), 在我的问题中,假设它们以矩阵形式排列,其中仅显示上三角形: t 0 1 2 (tiles) # 1 2 3 4 5 6 7 8 9 1 [ 0 1 0 0 0 0 0 0 0 ] 0 2 [ x 0 0 0 0 0 0 0 1 ] 3 [ x x 0 0 0 0 0 0 0 ] 4 [ x x x 0 1 1 0 0 0 ] 1 5 [ x x x x 0 0 0 1 0 ] 6 [ x x x x x 0 0 0 0 ] 7 [ x x x x x x 0 1 0 ] 2 8 [ x x x x x x x
我正在编写备件网格代码,需要将n个1维网格点(以向量形式编写)结合到所有可能点的数组中.例如,一个可以将两个向量(a,b)与(c,d,e)混合在一起,给出以下几点: (a,c)(a,d)(a,e) (b,c)(b,d)(b,e) matlab具有称为combvec的函数: http://www.mathworks.co.uk/help/nnet/ref/combvec.html 我正在用fortran编写此代码,但是我找不到基础算法.该代码需要接收n(n> 1)向量(即2,3 ... n),每个向量可以是不同的长度.有人知道算法吗? 解决方案 我不知道Fortran,但是由于您说您找不到基础算法,因此我假设您一旦知道算法就可以自己写这篇文章.实际上很容易.伪代码将是这样的(假设没有重复项): index = 0 ! or 1 for each element in first vector for each element in seco
对于一个项目,我需要在Python中有效的功能来解决以下任务: 给出了一个非常大的列表x,x的稀疏矢量(=>大稀疏矩阵)和另一个包含一个向量y的矩阵y,我想要一个"距离"列表,y对x的每个元素都必须"距离"是这样定义的: 比较两个向量的每个元素,请始终将下一个元素总结. 示例: X = [[0,0,2], [1,0,0], [3,1,0]] Y = [[1,0,2]] 该功能应返回dist = [2,1,1] 在我的项目中,x和y都包含很多零,并以: 为例 到目前为止, 我设法编写了解决此任务的功能,但效率非常缓慢且效率低下.我需要一些有关如何高效过程/迭代稀疏矩阵的提示. 这是我的功能: def get_distances(X, Y): Ret=[] rows, cols = X.shape for i in
我希望在Python 2.7(本质上是k = numerator / denominator)中划分两个Sparce矩阵,结果是类型sp.csr_matrix的稀疏矩阵.我正在使用scipy as sp和numpy as np. 为此,我遵循将分子和分母倒数的点产物的线性格式遵循.这两个项目均为格式sp.csr_matrix(([],([],[])),shape=[R,R]). K本身的计算是 k = sp.csr_matrix(numerator.dot(sp.linalg.inv(denominator))) 这样做会返回警告: SparseEfficiencyWarning: splu requires CSC matrix format warn('splu requires CSC matrix format', SparseEfficiencyWarning) 上述警告是什么意思与确定k的身份作为两个稀疏矩阵之间的商的身份有关? 是否有更
i具有一个大的numpy阵列A形状m*3,每行的元素都是唯一的,非阴性整数,范围从0到n -1. . 例如,m = 4,n = 5,一个矩阵A看起来如下 array([[0, 1, 2], [0, 2, 3], [1, 2, 4], [3, 2, 4]]) 现在,我需要构造另一个大小m*n的数组B,以便 B[m,n] = 1 if n is in A[m], or else 0 示例a的相应B是 1 1 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 1 1 基于循环的代码将是 B = np.zeros((M,N)) for m in range(M): for n in B[m]: B[m,n]=1 但是,由于我有大的M和N(每个比例为10^6),我该如何使用良好的Numpy索引技术来加速此过程?此外,我认为还需要稀疏的矩阵技术,因为1个字节的m*n数据约为10 **
我有二维矩阵.我的矩阵很少.我面临性能问题.任何身体都可以回答我可以在Java中使用什么API或类来处理稀疏矩阵以提高我的程序性能. 例如,我想要 it take 100x100 matrix handle sparse stuff do the multiplication return me my matrix same as 100x100 with 0 ( mean sparse matrix ) 解决方案 JAMA对于大稀疏矩阵来说很糟糕. 请看一下 colt 线性代数库. 稀疏线性代数的另一种可能性是其他解决方案 suanshu 实施了大量稀疏矩阵.您可以简单地使用这些而不是自己写自己的. 他们目前支持这些格式:CSR,DOK,LIL 其他解决方案 您可以查看 la4j (Java的线性代数). LA4J支持稀疏的矩阵和密集的矩阵.这是受支持的矩阵类型的列表:1D阵列(密集),2D阵列(密度),CRS-压缩行存储(稀疏),CCS-
给定一个尺寸(170k x 170k)的Scipy CSC稀疏矩阵" SM",具有4.4亿个非零点点和一个稀疏的CSC Vector" V"(170K x 1),有几个非零点,有没有任何东西这可以改善操作的性能: resul = sm.dot(v) ? 目前大约需要1秒钟.将矩阵初始化为CSR的时间增加3秒,因此CSC的表现更好. sm是产品和V之间相似之处的矩阵,是代表用户购买或点击的产品的向量.因此,对于每个用户,SM都是相同的. 我正在使用Ubuntu 13.04,Intel I3 @3.4GHz,4个核心. 研究,因此我阅读了有关ABLAS软件包的信息.我输入了终端: ~$ ldd /usr/lib/python2.7/dist-packages/numpy/core/_dotblas.so 导致: linux-vdso.so.1 => (0x00007fff56a88000) libblas.so.3 => /
我们有一个存储稀疏矩阵的应用程序.该矩阵的条目主要存在于矩阵的主对角线周围.我想知道是否有任何有效的算法(或现有库)可以有效处理这种稀疏矩阵?最好是,这将是一个通用实现,每个矩阵条目都可以是用户定义的类型. 编辑问题/回答: 当我大多在主角周围说时,我的意思是,大多数矩阵的特征将是大多数条目都聚集在主对角线中,但可能会靠近对角线,并且可能存在非零值远离对角线.我想要在这里为"大多数"案例有效的东西. 我将使用它来做什么?我需要能够有效地访问连续的所有值或列中的所有值.存储的值将是布尔值.一个例子是: 对于连续的所有真实值,foreach列a true在集合列的所有条目中出现到某些内容 对于连续的所有虚假值,将条目设置为某物 这一切都是以前用链接列表完成的,但实施非常困惑.我希望有一个稀疏的矩阵我可以改进算法,但是发现"正确"类型的稀疏基质算法已被证明很困难. P.S.感谢您到目前为止的回复 解决方案 您可以根据单元格的[行,col]使用索
我正在努力实现以下等式: X =(Y.T * Y + Y.T * C * Y) ^ -1 y是A(n x f)矩阵,c为(n x n)对角线; n约为300k,F在100到200之间变化.作为优化过程的一部分,该方程将被使用近1亿次,因此必须非常快地处理. y是随机初始化的,C是一个非常稀疏的矩阵,在对角线上只有300K中的几个数字将与0. Numpy的对角线函数产生密集的矩阵,我创建了C作为稀疏的CSR矩阵.但是,当试图求解等式的第一部分时: r = dot(C, Y) 计算机崩溃适当的内存限制.我决定然后尝试将y转换为csr_matrix并进行相同的操作: r = dot(C, Ysparse) 这种方法采用 1.38 ms .但是这个解决方案有些"棘手",因为我正在使用稀疏的矩阵来存储一个密集的矩阵,我想知道这是多么有效. 所以我的问题是,是否有某种方法可以将稀疏的C和稠密的y倍增,而不必将y变成稀疏并提高性能?如果以某种方式可以将C表示为
当行i 和列包含所有0时,我都在尝试删除行I和列I.例如,在这种情况下,我们可以看到第0行是所有零,而列0是所有零,因此删除了行和列0.与行列对2和4相同.第1行是所有零,但列1并非删除. [0,0,0,0,0] [0,1,0,1,0] [0,0,0,0,0] [0,0,0,0,0] [0,0,0,0,0] 将成为 [1,1] [0,0] 另一个示例: [0,0,1,0,0,1] [0,0,0,0,0,0] [0,0,0,0,0,0] [0,0,0,0,0,0] [0,0,0,0,0,0] [0,0,1,0,1,0] 将更改为: [0,1,0,1] [0,0,0,0] [0,0,0,0] [0,1,1,0] 这是我用来计算的代码: def remove(matrix): for i, x in reversed(list(enumerate(matrix))): if np.all(matrix == 0, axis=
到目前为止,我使用numpy.linalg.eigvals来计算至少1000行/列的二次矩阵的特征值,并且在大多数情况下,大约五分之一的条目是非零的(我不知道是否应该这样被认为是稀疏矩阵).我发现另一个主题表明Scipy可以可以可能做得更好. 但是,由于我必须计算数十万个大小的大型矩阵(可能达到20000行/列,是的,我需要他们所有的特征值),这总是很长的时间.如果我能加快事情的速度,即使是最小的一点,也很可能值得付出努力. 所以我的问题是:当不限制自己到python时,是否有一种更快的方法来计算特征值? 解决方案 @highperformancemark在评论中是正确的,因为Numpy(Lapack等)背后的算法是最好的,但也许不是最新的,也许是数值的算法,用于对角线构成完整矩阵.但是,如果您有: 稀疏矩阵 如果您的矩阵稀疏,即填充条目的数量为K,则k
我有一个稀疏的csr_matrix,我想将单行的值更改为不同的值.但是,我找不到简单有效的实现.这就是它必须做的: A = csr_matrix([[0, 1, 0], [1, 0, 1], [0, 1, 0]]) new_row = np.array([-1, -1, -1]) print(set_row_csr(A, 2, new_row).todense()) >>> [[ 0, 1, 0], [ 1, 0, 1], [-1, -1, -1]] 这是我当前的set_row_csr: 的实现 def set_row_csr(A, row_idx, new_row): A[row_idx, :] = new_row return A ,但这给了我一个SparseEfficiencyWarning.有没有一种方法可以完成此操作,而无需手动索引杂耍,还是我唯一的出路?
在MATLAB中,如果我仍然有很多计算要做,那么在什么时候比正常数组更好,而大约25%的数组是非Zeros? 解决方案 就个人而言,我很少会因稀疏而稀疏,而这个数组仅为25%的非均方体.如果您不相信我,请自己尝试. A = sprand(2000,2000,0.25); tic,B = A*A;toc Elapsed time is 1.771668 seconds. Af = full(A); tic,B = Af*Af;toc Elapsed time is 0.499045 seconds. 与此有关的额外工作,因为稀疏矩阵的成本太高了,值得一提.现在尝试使用真正稀疏的矩阵. A = sprand(2000,2000,0.005); Af = full(A); tic,B = A*A;toc Elapsed time is 0.037763 seconds. tic,B = Af*Af;toc Elapsed time is 0.446680 seco
我的问题是双重的: 在下面,A = full(S)其中S是稀疏的矩阵. 访问稀疏矩阵中元素的"正确"方法是什么? 也就是说,稀疏等同于var = A(row, col)是什么? 我对此主题的看法:您不会做任何不同的事情. var = S(row, col) 在稀疏矩阵中添加元素的"正确"方法是什么? 也就是说,稀疏等效的A(row, col) = var是什么? (假设A(row, col) == 0开始) 众所周知,对于大型稀疏矩阵而言,简单地做A(row, col) = var是缓慢的.来自 如果您想更改此矩阵中的值,您可能会被诱惑 使用相同的索引: b(3,1)= 42; %此代码确实有效,但是它很慢. 我对此主题的看法:使用稀疏矩阵时,您通常从向量开始,然后使用它们以这种方式创建矩阵:S = sparse(i,j,s,m,n).当然,您也可以像这样创建它:S = sparse(A)或sprand(m,n,density)或类
来自> sklearn.__version__ '0.16.1' > pca = RandomizedPCA(n_components=2) > pca.fit(my_sparce_mat) TypeError: A sparse matrix was passed, but dense data is required. Use X.toarray() to convert to a dense numpy array. 我使用fit_transform 获得了相同的错误 关于如何工作的任何建议? 解决方案 答案是,不可能与Scikit-Learn版本0.16.1(当前稳定版本)一起使用稀疏矩阵.我所指的文档是用于先前版本的Scikit-Learn,因此应将替代功能用于当前稳定版本. 可能的替代方案是TruncatedSVD
我正在使用R进行文本分类任务,并且我获得了一个尺寸22490 x 120,000(只有400万个非零条目,小于1%的条目)的文档期矩阵.现在,我想利用PCA(主要组件分析)来降低维度.不幸的是,R无法处理这个巨大的矩阵,因此我将此稀疏矩阵存储在"矩阵市场格式"中,希望使用其他一些技术来执行PCA. 所以任何人都可以给我一些有用的库(无论编程语言),可以轻松使用这个大型矩阵,或者我自己做一个长的pca,换句话说, 首先计算协方差矩阵,然后计算协方差矩阵 的特征值和特征向量. 我想要的是 计算所有PC(120,000),并仅选择占90%差异的顶级PC .显然,在这种情况下,我必须给出一个先验的阈值,以将一些非常小的差异值设置为0(在协方差矩阵中),否则,协方差矩阵不会稀疏,其大小将为120,000 x 120,000,这是一台机器不可能处理.同样,负载(特征向量)将非常大,应以稀疏格式存储. 非常感谢您的任何帮助! 注意:我正在使用带有24GB RAM和8个CPU内核
我试图并行化朱莉娅稀疏基质的创建.受这篇文章的启发,这篇文章我正在尝试: using Distributed addprocs(4) @everywhere using DistributedArrays rows = [Int[] for _ in procs()] cols = [Int[] for _ in procs()] vals = [Float64[] for _ in procs()] distribute(rows) distribute(cols) distribute(vals) @sync @distributed for i = 1:1000 for j = 1:1000 v = exp(-(i - j)^2) if v > 0.1 push!(localpart(rows)[1], i) push!(localpart(cols)[1], j)