减少矩阵比较中的计算次数

时间:2015-08-28 23:51:48

标签: r algorithm matrix

我正在编写一种算法来计算元素之间的距离。例如,我有一个3行和2列的数据集(学生A,B和C)和他们的高度。我必须对所有元素的距离进行区分并计算矩阵。所有可能的计算是A-A,A-B,A-C,B-A,B-B,B-C,C-A,C-B,C-C。但是A-B和B-A的绝对差异是相等的。

目前我使用了if条件来避免比较相似的元素(A-A,B-B)。但仍然有重复的计算。我的目标是避免重复计算。

例如,如果完成A-B,则不计算B-A,并且将A-B的值分配给正确的矩阵位置。如果有人可以就此提出建议,那会很有帮助。

更新: 场景:我有3 files(data_A,data_B和data_C)。将这些文件视为模型。每个模型都有一组属性(A,B,C,D)。不同的模型有不同的属性。例如data_A(A,B,C),data_B具有(A,D,C),data_C具有(A,B,C)。

我的目标是根据公共属性比较模型。首先,我扫描模型,找出所有模型共有的属性。在这种情况下,它只有A和C.接下来,我将根据常见属性对每个模型进行成对比较。例如,我将计算data_A中A的欧几里德距离和data_B中的A,data_A中的C和data_B中的C.首先,我将计算每对的平方差的总和,然后计算该值的平方根。对每个模型对中的所有代谢物对重复这一过程,最后平方根距离的累积值将给出模型之间的单个距离值。

如果我将data_A与data_B进行比较,我的问题就在于我的算法。我不需要进行反向计算(即data_B与data_A)。目前我只忽略使用if条件对相同数据集进行比较。以下是我的代码。它可能不是编写它的最佳方式。

setwd("E:/Assignment")
uniqueDataSets = list.files(pattern = "\\.csv$")
commonVariables = c("A","C")

#To store the distances
results  = data.frame(DataSet1 = character(), DataSet2 = character(), Distance=numeric() , stringsAsFactors = F)

for(i in 1:length(uniqueDataSets)) #loading the files as reference file
{
  currentDataSetName = uniqueDataSets[i]
  currentDataSet = read.csv(currentDataSetName)

  for(j in 1:length(uniqueDataSets)) #loading the file as comparison files
  {
    comparedDataSetName = uniqueDataSets[j]
    comparedDataSet = read.csv(comparedDataSetName)

    totalDistance = 0
    tempDist = 0

    if(currentDataSetName != comparedDataSetName) #Ignoring comparison if it's the same data set
    {
      for(k in 1:length(commonVariables)) #computing pair wise distance for each metabolite
      {
        var1 = currentDataSet[commonVariables[k]]
        var2 = comparedDataSet[commonVariables[k]]

        tempDist = sqrt(sum((var1 - var2)^2))
        totalDistance = totalDistance + tempDist #cumulative value of the distance between 2 models
      }

    } else{
      totalDistance = 0
    }

    results = rbind(results, data.frame(DataSet1=currentDataSetName, DataSet2 = comparedDataSetName, Distance =totalDistance))

  }
}

2 个答案:

答案 0 :(得分:2)

R内置了这个:

x <- matrix(c(1.56, 1.64, 1.75), nrow = 3)
row.names(x) <-c("a", "b", "c")
dist(x)

答案 1 :(得分:0)

使用@ jeremycg数据的其他方式:

view

不可否认,对于大型数据集来说,这些要慢一些。他们都给出了:

utils::combn(x, m=2, FUN=diff)
combn(x, m=2, FUN=`-`)