填充没有双打的矩阵

时间:2016-11-09 14:57:32

标签: c# matrix

我正在处理基于项目的协作过滤器,您需要在项目之间进行相似性处理。我发现创建一个像下面这样的矩阵运行良好,但我现在想阻止它计算双精度。

我将用一个例子来解释我的意思。假设您有一个包含5个项目的列表,每个项目都有基于相似性的评级。

在计算相似之后,我想出了以下矩阵:

     I1 | I2 | I3 | I4 | I5 |
I1 |  1 | 0.5| 0.3| 0.2| 0.9|
I2 | 0.5|  1 | 0.2| 0.1| 0.8| 
I3 | 0.3| 0.2|  1 | 0.5| 0.1|
I4 | 0.2| 0.1| 0.5|  1 | 0.7|
I5 | 0.9| 0.8| 0.1| 0.7|  1 |

我使用以下代码执行此操作:

//allItems is a list of the 5 items
foreach (var item1 in allItems)
    foreach (var item2 in allItems)
        ComputeSimilarity(item1, item2);

//ComputeSimilarity(); returns a double, a.k.a. the similarity between items

你可以忽略函数的内部工作原理,因为它工作正常,我只是无法改变代码,所以它不会计算两次。

如何更改此函数以使计算的矩阵看起来像这样?

     I1 | I2 | I3 | I4 | I5 |
I1 |    | 0.5| 0.3| 0.2| 0.9|
I2 |    |    | 0.2| 0.1| 0.8| 
I3 |    |    |    | 0.5| 0.1|
I4 |    |    |    |    | 0.7|
I5 |    |    |    |    |    |

让我知道我是否应该详细说明!提前谢谢!

3 个答案:

答案 0 :(得分:2)

这应该这样做:

$yearGroup = array();
foreach($array as $key => $value){
    $yearGroup[$value['year']] = $value;
}

答案 1 :(得分:1)

您可以在计算前添加支票

for (int i = 0; i < allItems.Count;i++ )
    for (int j = 0; j < allItems.Count; j++)
        if(i<j)
        ComputeSimilarity(allItems[i], allItems[j]);

答案 2 :(得分:0)

试试这个

        double val;
        for (int i = 0; i < allItems.Count; i++)
        {
            for (int j = i; j < allItems.Count; j++)
            {
                if (i!=j)
                    val = ComputeSimilarity(allItems[i], allItems[j]);
            }
        }