MATLAB:如何使用稀疏结构应用矢量化函数?

时间:2015-09-28 16:27:32

标签: matlab sparse-matrix

我需要(重复)从长度为2500的向量构建一个长度为200的向量。我可以使用一个非常稀疏的矩阵来描述这个操作:它是200x2500并且每行只有一个条目。但我几乎无法控制这个条目的位置。我的实际问题是我需要将此矩阵应用于我当前所具有的向量,而不是该向量的某些分量函数。由于我具有所有这些稀疏性,因此将此分量函数应用于向量的所有2500个组件是浪费的。相反,我宁愿将它仅应用于实际贡献的200个组件。

一个程序(随机选择的数字代替我的实际数字)可能有类似的问题:

ind=randi(2500,200,1);
coefficients=randn(200,1);
A=sparse(1:200,ind,coefficients,200,2500);
x=randn(2500,1);
y=A*subplus(x);

我不喜欢的是将subplus应用于所有x;我宁愿只需要将它应用于x(ind),因为只有这对矩阵乘积有贡献。

现在我能看到解决这个问题的唯一方法是用200分量的系数向量和200分量的索引向量替换我的稀疏矩阵。以这种方式工作,上面的代码将成为:

ind=randi(2500,200,1);
coefficients=randn(200,1);
x=randn(2500,1);
y=coefficients.*subplus(x(ind))

有没有更好的方法来做到这一点,最好是当A每行包含一些元素而不是只有一个元素时才会有效?

1 个答案:

答案 0 :(得分:0)

你问题中的代码会引发异常,我认为它应该是:

n=2500;
m=200;
ind=randi(n,m,1);
coefficients=randn(m,1);
A=sparse(1:m,ind,coefficients,m,n);
x=randn(n,1);

您使用x(ind)的想法基本上是正确的,但是ind会重新排序x这不是预期的。相反,您可以使用sort(unique(ind))。我选择使用稀疏逻辑索引any(A~=0),因为我希望它更快,但你可以比较两个版本。

%original code
y=A*subplus(x);

%multiplication using sparse logical indexing:
relevant=any(A~=0);
y=A(:,relevant)*subplus(x(relevant));

%fixed version of your code
relevant=sort(unique(ind));
y=A(:,relevant)*subplus(x(relevant));