规范化一个巨大的稀疏矩阵

时间:2012-08-30 21:01:50

标签: matlab sparse-matrix

我有一组高维但非常稀疏的矩阵。我想对它们进行标准化,以便所有矩阵的列总和加总为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

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

你能建议一个更好的选择吗?

2 个答案:

答案 0 :(得分:1)

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

bsxfun(@rdivide,A,normalizer);

答案 1 :(得分: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.