1

我有一组高维但非常稀疏的矩阵。我想对它们进行归一化,以便所有矩阵的列总和为 1。

这是我使用的示例代码:

bg = matrices{1};
for i = 2:length(matrices) , bg = bg + matrices{i}; end
normalizer = sum(bg);
for i = 1:length(matrices) 
    for j = 1:size(matrices{i},1)
        matrices{i}(j,:) = matrices{i}(j,:) ./ normalizer;
    end
end

但是,您可以猜到这非常慢。一种选择是:

for i = 1:length(matrices) 
    matrices{i} = matrices{i} ./ repmat(normalizer,size(matrices{i},1),1);
end

但这会停止,因为没有足够的内存来创建一个巨大且几乎完整的矩阵(使用规范化器重复)

你能推荐一个更好的选择吗?

4

2 回答 2

1

如果您将问题转换为单个稀疏矩阵,那么您可以使用

bsxfun(@rdivide,A,normalizer);
于 2012-08-30T22:10:43.223 回答
0

@Jacob 的回答是正确的,但速度很慢。在 matlab 中使用稀疏矩阵乘法会快得多:

diag(sparse(normalizer.^-1)) * A;

比较:

s=50000;A = sprand(s,s,6*s^-1);normalizer = sum(A,2);
tic;B = bsxfun(@rdivide,A,normalizer);toc
tic;C = diag(sparse(normalizer.^-1)) * A;toc
assert(max(max(abs(B-C))) < eps)

在我的机器上,我得到:

Elapsed time is 6.393976 seconds.
Elapsed time is 0.009804 seconds.
于 2018-11-09T18:02:25.050 回答