我有一组高维但非常稀疏的矩阵。我想对它们进行标准化,以便所有矩阵的列总和加总为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
但这会停止,因为没有足够的内存来创建一个巨大且接近完整的矩阵(用规范化器重复)
你能建议一个更好的选择吗?
答案 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.