【发布时间】:2015-12-10 09:14:38
【问题描述】:
给定 MATLAB 中的稀疏矩阵 A 及其列 m 中非零元素的均值,无论如何都要从均值中减去每列中的非零元素并避免在列上循环?
我正在寻找有效的解决方案。如果可以使用,使用“bsxfun”可能是一种解决方案。
谢谢
【问题讨论】:
给定 MATLAB 中的稀疏矩阵 A 及其列 m 中非零元素的均值,无论如何都要从均值中减去每列中的非零元素并避免在列上循环?
我正在寻找有效的解决方案。如果可以使用,使用“bsxfun”可能是一种解决方案。
谢谢
【问题讨论】:
您可以使用find 的第二个输出来获取列索引;使用这些索引到m 进行减法;并使用logical indexing 将结果放回A:
A = sparse([0 0 0 0; 1 0 3 2; 2 1 0 5]); %// example data
m = [1.5 1 3 3.5]; %// vector of mean of nonzero elements of each column
m = m(:);
[~, jj, vv] = find(A);
A(logical(A)) = vv - m(jj);
原A:
>> full(A)
ans =
0 0 0 0
1 0 3 2
2 1 0 5
最终A:
>> full(A)
ans =
0 0 0 0
-0.5000 0 0 -1.5000
0.5000 0 0 1.5000
【讨论】:
bsxfun(@minus, A, m).*logical(A),但是bsxfun的中间结果不会稀疏,所以你可能会遇到内存问题