小编Ale*_*ros的帖子

使用Levenshtein距离进行文本聚类

我有一组(2k - 4k)的小字符串(3-6个字符),我想将它们聚类.由于我使用字符串,以前的答案关于如何进行聚类(尤其是字符串聚类)?,告诉我,Levenshtein距离很适合用作弦乐的距离函数.此外,由于我事先并不知道群集的数量,因此分层聚类是要走的路而不是k-means.

虽然我以抽象的形式得到问题,但我不知道实际做什么的简单方法.例如,MATLAB或R是使用自定义函数(Levenshtein距离)实际实现层次聚类的更好选择.对于这两种软件,人们可以很容易地找到Levenshtein距离实现.聚类部分似乎更难.例如,MATLAB中的聚类文本计算所有字符串的距离数组,但我无法理解如何使用距离数组来实际获得聚类.你能不能向大家们展示如何在MATLAB或R中使用自定义函数实现层次聚类的方法?

matlab r cluster-analysis hierarchical-clustering levenshtein-distance

31
推荐指数
1
解决办法
2万
查看次数

C++使用SSE指令来比较整数的大量向量

我有一个巨大的vector<vector<int>>(18M x 128).我经常想要获取此向量的两行并通过此函数进行比较:

    int getDiff(int indx1, int indx2) {
    int result = 0;
    int pplus, pminus, tmp;

    for (int k = 0; k < 128; k += 2) {
        pplus = nodeL[indx2][k] - nodeL[indx1][k];
        pminus = nodeL[indx1][k + 1] - nodeL[indx2][k + 1];

        tmp = max(pplus, pminus);
        if (tmp > result) {
            result = tmp;
        }
    }
    return result;
}
Run Code Online (Sandbox Code Playgroud)

如你所见,函数循环通过两个行向量做一些减法,最后返回一个最大值.这个功能将被使用一百万次,所以我想知道它是否可以通过SSE指令加速.我使用Ubuntu 12.04和gcc.

当然这是微优化,但如果你能提供一些帮助会有所帮助,因为我对SSE一无所知.提前致谢

基准测试:

    int nofTestCases = 10000000;

    vector<int> nodeIds(nofTestCases);
    vector<int> goalNodeIds(nofTestCases);
    vector<int> results(nofTestCases);

    for (int l = …
Run Code Online (Sandbox Code Playgroud)

c++ sse vector

10
推荐指数
1
解决办法
2550
查看次数

SIMD延迟吞吐量

在针对大多数说明的英特尔Intrisics指南中,它还具有延迟和吞吐量的值.例:

__m128i _mm_min_epi32

Performance
Architecture Latency Throughput
Haswell      1       0.5
Ivy Bridge   1       0.5
Sandy Bridge 1       0.5
Westmere     1       1
Nehalem      1       1
Run Code Online (Sandbox Code Playgroud)

这些数字究竟是什么意思?我认为较慢的延迟意味着命令执行时间较长,但Nehalem的吞吐量1和常春藤的0.5,意味着Nehalem的命令更快?

c++ performance x86 sse simd

10
推荐指数
2
解决办法
2307
查看次数

Haswell上的AVX2比SSE慢

我有以下代码(普通,SSE和AVX):

int testSSE(const aligned_vector & ghs, const aligned_vector & lhs) {
    int result[4] __attribute__((aligned(16))) = {0};
    __m128i vresult = _mm_set1_epi32(0);
    __m128i v1, v2, vmax;

    for (int k = 0; k < ghs.size(); k += 4) {
        v1 = _mm_load_si128((__m128i *) & lhs[k]);
        v2 = _mm_load_si128((__m128i *) & ghs[k]);
        vmax = _mm_add_epi32(v1, v2);
        vresult = _mm_max_epi32(vresult, vmax);
    }
    _mm_store_si128((__m128i *) result, vresult);
    int mymax = result[0];
    for (int k = 1; k < 4; k++) {
        if (result[k] > mymax) { …
Run Code Online (Sandbox Code Playgroud)

c++ x86 sse simd avx2

8
推荐指数
2
解决办法
5542
查看次数

Postgres GROUP BY整数数组

我在Postgres 9.3中的数据库表

| f1|f2 | f3
| 1 | 2 | {1,2,3}
| 1 | 3 | {4,5}
Run Code Online (Sandbox Code Playgroud)

f1,f2是整数f3是整数[].

我怎么能得到这个:

SELECT f1, myfn(f3)
FROM dbTable
GROUP BY f1;
Run Code Online (Sandbox Code Playgroud)

这样我得到:

| 1 | {1,2,3,4,5}
Run Code Online (Sandbox Code Playgroud)

Postgres中是否有类似的函数,如array_agg,它连接数组并创建一个新数组;

arrays postgresql aggregate-functions

6
推荐指数
1
解决办法
1484
查看次数

OpenMp根据变量设置并行循环的线程数

有没有办法根据变量的值在OpenMP中为区域并行设置线程数?最初为整个应用程序的线程数= nofCores.在我的AMD FX 8350上,nofCores = 8.对于这个区域,如果变量是3,那么我只需要3个线程.如果变量>核心,则线程数应保持等于nofCores.

我不想为所有应用程序全局设置线程数.仅适用于此特定的并行循环.

对不起,如果这是一个天真的问题,但我是OpenMP的新手.

c++ openmp

5
推荐指数
1
解决办法
1万
查看次数

对构造函数的调用不能出现在常量表达式中

我很抱歉我的新手问题,但我对C++知之甚少.任何人都可以回答为什么我在编译下面的代码时得到错误"错误:对构造函数的调用不能出现在常量表达式中";

class EliminationWeight
{
 public:
    typedef double Type;
    static const Type MAX_VALUE = __DBL_MAX__;
    static const Type MIN_VALUE = -__DBL_MAX__;
};
Run Code Online (Sandbox Code Playgroud)

我使用Ubuntu 12.04和随附的gcc.这不是我的代码,我知道这个代码可能100%正常工作(可能在旧版本的gcc或其他编译器中).有没有快速解决方法?

在此先感谢您的回答,这实际上是我第一次问SO.

c++

2
推荐指数
1
解决办法
5248
查看次数

使用SSE进行矢量初始化

我是C++的新手(从Java转移到我的科学应用程序的性能),我对SSE一无所知.不过,我需要改进以下非常简单的代码:

    int myMax=INT_MAX;
    int size=18000003;
    vector<int> nodeCost(size);

    /* init part */
    for (int k=0;k<size;k++){
     nodeCost[k]=myMax;
    }
Run Code Online (Sandbox Code Playgroud)

我已经测量了初始化部分的时间,它需要13ms,这对于我的科学应用来说太大了(整个算法在22ms运行,这意味着初始化占总时间的1/2).请记住,初始化部分将针对同一向量重复多次.

如您所见,向量的大小不会除以4.有没有办法加速SSE的初始化?你能建议怎么样?我是否需要使用数组或SSE也可以与向量一起使用?

请,因为我需要你的帮助,所以我们都避免a)"你是如何衡量时间"或b)"过早优化是所有邪恶的根源",这对你来说是合理的,但a)测量的时间是正确的b我同意,但我别无选择.我不想将代码与OpenMP并行化,因此SSE是唯一的后备.

谢谢你的帮助

c++ sse vector

2
推荐指数
2
解决办法
874
查看次数

为二进制搜索排序对象矢量

我有以下课程:

struct EdgeExtended {
    int neighborNodeId;
    int weight;
    int arrayPointer;
    bool isCrossEdge;

};
Run Code Online (Sandbox Code Playgroud)

我想要一个这样的对象的向量,通过neighborNodeId对它进行排序.然后我想搜索特定的neighborNodeId并通过二进制搜索返回对向量中找到的对象的引用.以前我用过地图,所以就是这样的:

map<int, EdgeExtended> neighbours;
.....

auto it = neighbours.find(dnodeId);
if (it != neighbours.end()) {
    edgeMap = it->second; 
}
Run Code Online (Sandbox Code Playgroud)

代替

map<int, EdgeExtended> neighbours;
Run Code Online (Sandbox Code Playgroud)

我希望有

vector<EdgeExtended> neighbours;
Run Code Online (Sandbox Code Playgroud)

并保留尽可能多的旧代码.

我想测量矢量是否比地图快,因为我正在构建数千个矢量(或地图),每个矢量(地图)相对较小(~10个项目).我不知道如何a)通过neighborNodeId对对象进行排序,以及b)如何使用二进制搜索来搜索类的特定成员(neighborNodeId).抱歉,这个菜鸟问题.我指望你的帮助.

c++ vector map binary-search jquery-ui-sortable

2
推荐指数
1
解决办法
1586
查看次数

禁用非Haswell处理器上的AVX2功能

我已经写了一些AVX2代码在Haswell i7处理器上运行.相同的代码库也用于非Haswell处理器,其中相同的代码应替换为其SSE等效代码.我想知道有没有办法让编译器忽略非Haswell处理器上的AVX2指令.我需要这样的东西:

public void useSSEorAVX(...){
    IF (compiler directive detected AVX2)
        AVX2 code (this part is ready)
    ELSE
        SSE code  (this part is also ready)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我在编译之前评论相关代码,但必须有一些更有效的方法来做到这一点.我正在使用Ubuntu和gcc.谢谢你的帮助.

c++ sse avx2

2
推荐指数
2
解决办法
2958
查看次数

Neo4j最短路径(BFS)距离查询变体

我不知道Neo4j所以,请耐心等待.我有一个大的(1M节点)无向,未加权的图形.假设我神奇地将此图导入Neo4j.Neo4j查询引擎(cypher)能否支持以下类型的查询?

  • 范围查询.带来距特定节点3个跳距离内的所有节点(及其距离)
  • 在特定节点和一组节点之间提供最短路径(BFS)距离(因为图形是无向的和未加权的).
  • 带来特定节点和所有其他图节点之间的最短路径(BFS)距离.

如果这些类型的查询实际上是可行的,没有递归类型实现,而是直接来自Cypher,我应该期望什么类型的性能(几秒,几秒或几分钟)?

neo4j cypher

2
推荐指数
1
解决办法
2305
查看次数

在Linux中拆分有序文件

我有一个大的分隔文件(管道'|'作为分隔符)我已经设法根据第一(数字),第二(数字)和第四列(字符串排序)排序(使用linux排序),因为它是一个时间戳值).该文件是这样的:

77|141|243848|2014-01-10 20:06:15.722|2.5|1389391203399
77|141|243849|2014-01-10 20:06:18.222|2.695|1389391203399
77|141|243850|2014-01-10 20:06:20.917|3.083|1389391203399
77|171|28563|2014-01-10 07:08:56|2.941|1389344702735
77|171|28564|2014-01-10 07:08:58.941|4.556|1389344702735
77|171|28565|2014-01-10 07:09:03.497|5.671|1389344702735
78|115|28565|2014-01-10 07:09:03.497|5.671|1389344702735
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种简单的方法可以在第一列或第二列值发生变化时将此文件拆分为多个文本文件,其中包含awk,sed,grep或perl one liner.示例文件的最终结果应该是3个文本文件:

77|141|243848|2014-01-10 20:06:15.722|2.5|1389391203399
77|141|243849|2014-01-10 20:06:18.222|2.695|1389391203399
77|141|243850|2014-01-10 20:06:20.917|3.083|1389391203399

77|171|28563|2014-01-10 07:08:56|2.941|1389344702735
77|171|28564|2014-01-10 07:08:58.941|4.556|1389344702735
77|171|28565|2014-01-10 07:09:03.497|5.671|1389344702735

78|115|28565|2014-01-10 07:09:03.497|5.671|1389344702735
Run Code Online (Sandbox Code Playgroud)

我当然可以用Java做到这一点,但我认为如果可以用脚本完成它会有点矫枉过正.另外,创建的文件名是否可能使用这两个列值,第一个文件为77_141.txt,第二个文件为77_171.txt,第三个文件为78_115.txt?

linux shell perl awk sed

1
推荐指数
1
解决办法
119
查看次数