【发布时间】:2015-02-02 22:05:51
【问题描述】:
我的 matlab 计算速度有点问题。我能够在 matlab 中编写代码来运行小矩阵的计算,但它使用嵌套的 for 循环,并且对于我正在使用的大型数据集,matlab 无法完成计算。
注意:我对 Matlab 不是很熟悉,所以虽然程序可以运行,但效率极低。
简而言之,我正在尝试创建一个矩阵,其条目描述一组独特位置之间的关系。作为一个具体的例子,我们从这个矩阵开始:
B =
5873 4 1
5873 7 1
5873 1 1
2819 8 2
2819 1 2
9771 4 3
9771 2 3
9771 5 3
9771 6 3
5548 7 4
其中第三列是唯一的位置标识符,第二列是恰好在该位置中的“段”的编号。请注意,多个段可以落入不同的位置。
我想要创建一个描述不同位置之间关系的矩阵。具体来说,对于位置 i 和 j,我希望新矩阵的 (i,j) 条目是 i 和 j 共有的段数除以 i 和 j 组合的段总数。
目前我的代码如下所示:
C = zeros(max(B.data(:,3)), max(B.data(:,3)));
for i = 1:max(B.data(:,3))
for j = 1:max(B.data(:,3))
vi = B.data(:,3) == i;
vj = B.data(:,3) == j;
C(i,j) = numel(intersect(B.data(vi,2), B.data(vj,2))) / numel(union(B.data(vi,2), B.data(vj,2)));
end
end
但它非常非常慢。有人对加快计算有什么建议吗?
非常感谢!!
【问题讨论】:
-
位置和段的典型数量是多少?
-
您能否根据上述示例提供您期望的示例输出?输入定义明确,但输出是什么样的?这主要是因为在尝试解决问题之前,我想确保我了解您的问题。
-
大家好,非常感谢您的回复!我正在寻找的是一个矩阵 C = [1 .25 .16 .33 ; .25 1 0 0 ; .16 0 1 0 ; .33 0 0 1],这是一个对称矩阵,对角线为 1。
-
我正在使用的数据集非常大。最大的有 6,418,784 行和 24,814 个唯一位置,这意味着结果矩阵的大小为 24814x24814。非常感谢您提供的不同方法,我不确定哪种方法适合这么大的数据集。
标签: performance matlab for-loop matrix