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

MATLAB: How to apply a vectorized function using sparsity structure?

我需要(重复)从一个长度为 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);

这里我不喜欢对所有 x 应用减号;我宁愿只将它应用于 x(ind),因为只有它对矩阵乘积有贡献。

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

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

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

你问题中的代码抛出异常,我觉得应该是:

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));