如何提高矩阵中低于阈值的列的计数性能?

时间:2013-11-20 09:07:19

标签: r performance matrix

在我的代码中,我从同一矩阵的每隔一列中减去一列矩阵。 然后我计算有多少新列只有小于r的元素。 我正在为矩阵的每一列做这个。你可以在下面看到我的代码。我遗漏了将值放入矩阵的部分。

有没有办法提高此代码的性能?我似乎无法找到一种方法来加快速度

B = matrix(NA,(m),(window_step))
B_m_r = c(1:(window_step))

for (i in 1:(window_step)){
    B_m_r[i] = sum(apply(abs(B[,-i]-B[,i]), 2,function(x) max(x) < r))
}

解决方案

B = matrix(NA,(m),(window_step))
B_m_r = c(1:(window_step))
buffer_B = matrix(NA,(window_step-1),(window_step-1))

for (i in 1:(window_step-2)){
    buffer_B[i,c(i:(window_step-1))] = apply(abs(B[,-c(1:i)]-B[,i]),2,function(x) max(x) < r)
    B_m_r[i] = (sum(buffer_B[i,c(i:(window_step-1))])+sum(buffer_B[1:i,i]))
}

B_m_r[window_step] = sum(buffer_B[1:(window_step-1),(window_step-1)])
B_m_r[window_step-1] =  sum(buffer_B[1:(window_step-2),(window_step-2)])

好的,基于Яaffael的帮助,我找到了一个解决方案,它不会两次计算差异。

相反,我将比较的结果与r中之前的循环中的buffer_B保存,并将它们用于下一个循环,以计算小于{{1}的所有列的总和}。

现在代码只需要一半的时间才能完成。 谢谢!

1 个答案:

答案 0 :(得分:0)

您可以例如通过仅检查一半列差异的“&lt; r”来将计算时间减少50%,因为它们实际上是对称的。

你正在计算abs(B的第一个 - B的最后一个)和abs(B的最后一个 - B的第一个)。

PLUS 您可以预先计算处理后的差异矩阵,而不是使用for循环逐步设置它。

# I am using single-row matrices to keep it simple

> A <- matrix(1:4,ncol=4)

> A[,1:ceiling(ncol(A)/2)]
[1] 1 2

> A[,ncol(A):(floor(ncol(A)/2)+1)]
[1] 4 3

> A <- matrix(1:5,ncol=5)

> A[,1:ceiling(ncol(A)/2)]
[1] 1 2 3

> A[,ncol(A):(floor(ncol(A)/2)+1)]
[1] 5 4 3

> abs(A[,1:ceiling(ncol(A)/2)] - A[,ncol(A):(floor(ncol(A)/2)+1)])
[1] 4 2 0

如果你想加速R中的代码,那么首先应该尝试使用R函数将所有循环转换为矢量化表达式。循环将在R内运行。向量化函数调用允许R执行本质上编译的C代码。