【发布时间】:2011-07-27 05:31:09
【问题描述】:
我有一个矩阵,matrix_logical(50000,100000),它是一个稀疏逻辑矩阵(很多错误,一些正确)。我必须生成一个矩阵,intersect(50000,50000),对于每一对 i,j,matrix_logical(50000,100000) 行,存储行 i 和 j 都具有“true”作为值的列数。
这是我写的代码:
% store in advance the nonzeros cols
for i=1:50000
nonzeros{i} = num2cell(find(matrix_logical(i,:)));
end
intersect = zeros(50000,50000);
for i=1:49999
a = cell2mat(nonzeros{i});
for j=(i+1):50000
b = cell2mat(nonzeros{j});
intersect(i,j) = numel(intersect(a,b));
end
end
是否可以进一步提高性能?计算矩阵需要很长时间。我想避免代码第二部分中的双循环。
matrix_logical 是稀疏的,但在 MATLAB 中不会保存为稀疏,否则性能会变得最差。
【问题讨论】:
-
请注意,
intersect可能是一个错误的变量名选择,因为已经有一个interesect函数。 -
你有没有想过使用
pdist()和自定义距离函数来给出你想要的结果? -
@Eugenio:您要生成的结果矩阵(假设它具有
single类类型)太大而无法放入内存50000*50000*4/2^30 = 9.31 GB...
标签: performance matlab loops vectorization