在matlab中, 有n个向量(m维)的矩阵Mat(n, m)

要计算任两个向量间的距离, 即距离矩阵, 可使用以下的并行算法以加速:

#include <iostream>
#include <mex.h>
#include <matrix.h>
#include <thread> using namespace std; //提前定义线程数
const int nThreads = 4;
//全局变量
int rows, cols, nrow, nw;
double *inVals, *outVals; //线程运行体定义
void calc(int start, int end) {
double sum, tmp;
int no, i, j; //计算指定区间
for(no = start; no < end; no++) {
//第i输入向量
i = outVals[no + nrow] - 1; //C索引下标
//第j输入向量
j = outVals[no + 2 * nrow] - 1; //C索引下标
//计算两输入向量间的距离
sum = 0;
for(int k = 0; k < cols; k++)
{
tmp = (inVals[i + k * rows] - inVals[j + k * rows]);
sum += (tmp * tmp);
}
outVals[no + 2 * nrow] = sum;
}
} void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) {
if (nrhs != 1) {
mexPrintf("Usage: adjmat(double_features[n_rows * m_cols_features])\n");
} //指针指向输入数据
inVals = mxGetPr(prhs[0]); //输入矩阵的行数和列数
rows = mxGetM(prhs[0]);
cols = mxGetN(prhs[0]); //结果的行数nrow
//结果的列数nw=(i, j, distance)
nrow = (rows * rows - rows)/2, nw = 3; //分配结果内存
nlhs = 1;
plhs[0] = mxCreateDoubleMatrix(nrow, nw, mxREAL);
outVals = mxGetPr(plhs[0]); //在结果中分配i和j的组合
int curL = 0;
for(int i = 0; i < rows - 1; i++)
for(int j = i + 1; j < rows; j++) {
outVals[curL] = i + 1; //符合Matlab索引下标规范
outVals[curL + nrow] = j + 1; //符合Matlab索引下标规范
curL++;
} //按线程数分配计算区间
int seg = nrow / nThreads; //线程数组
thread threads[nThreads];
//分配每一个线程的计算区间,避免冲突
for(int i = 0; i < nThreads; i++) {
if (i == nThreads - 1)
threads[i] = thread(calc, i * seg, nrow);
else
threads[i] = thread(calc, i * seg, (i + 1) * seg);
}
//等待全部线程结束
for (int i = 0; i < nThreads; i++){
threads[i].join();
}
}

编译: (注意:看上一篇博文,怎样设置matlab支持C++ 11标准)

mex adjmat.cpp

Matlab中简单測试:

tic; x = rand(5000, 50);

adjmat(x);

toc

笔记本測试时间约:

0.57s

Matlab中特征向量间距离矩阵的并行mex程序的更多相关文章

  1. MEX程序中的mexFunction函数【转】

    与C中的main函数一样,MEX程序中的开始函数为mexFunction.默认变量参数是: void mexFunction(int nlhs, mxArray *plhs[], int nrhs, ...

  2. matlab中 mcc、mbuild和mex命令详解

    先简单的说说mcc.mbuild和mex到底怎么回事: mcc将M文件转换成C/C++文件和相应的MEX包裹文件(需要Matlab编辑器),但在特定条件下可以自动调用mbuild或者mex mex将C ...

  3. matlab中 mcc/mbuild/mex 区别

    mcc 的作用是将 .m文件编译为 c/c++动态链接库文件,使你可以在 c/c++程序中使用 matlab的一些函数功能.mcc 也可以将.m文件编译为exe可执行文件. mex 的作用是将 c/c ...

  4. 为什么安装了MinGW之后,还是不能在Matlab中使用mex?

    原文地址:http://blog.sina.com.cn/s/blog_53c7b1580102xjcw.html 老版本的Matlab自带lcc,在Matlab中输入mex -setup就可以选择. ...

  5. matlab中help所有函数功能的英文翻译

    doc funname 在帮助浏览器中打开帮助文档 help funname 在命令窗口打开帮助文档 helpbrowser 直接打开帮助浏览器 lookfor funname 搜索某个关键字相关函数 ...

  6. matlab中fft快速傅里叶变换

    视频来源:https://www.bilibili.com/video/av51932171?t=628. 博文来源:https://ww2.mathworks.cn/help/matlab/ref/ ...

  7. matlab中patch函数的用法

    http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...

  8. 【matlab】将matlab中数据输出保存为txt或dat格式

    将matlab中数据输出保存为txt或dat格式 总结网上各大论坛,主要有三种方法. 第一种方法:save(最简单基本的) 具体的命令是:用save *.txt -ascii x x为变量 *.txt ...

  9. 将matlab中数据输出保存为txt或dat格式

    :FID= FOPEN(filename,permission) 用指定的方式打开文件 FID=+N(N是正整数):表示文件打开成功,文件代号是N. FID=-1            : 表示文件打 ...

随机推荐

  1. 我对 aspnetpager和repeater以及查询条件的封装

    /// <summary>         /// 绑定所有图片列表         /// </summary>         /// <param name=&qu ...

  2. 理想中的SQL语句条件拼接方式

    背景 Orm用过一些,但处理增删改上面做的都不错.但是查询上跟我想要的效果总是差了一点.我想要的效果则是这样,基于某种命名规则进行传参,后台解析器知道命名规则即可知道它要查询什么样的数据. 谈谈我之前 ...

  3. 不只是内存分析工具~valgrind

    体系结构:原理介绍·参考好文:应用 Valgrind 发现 Linux 程序的内存问题 简单组一个摘要: Valgrind包括如下一些工具: Memcheck.这是valgrind应用最广泛的工具,一 ...

  4. CSS变量使用解析

    很早直接就了解到CSS变量相关的内容,奈何之前使用价值不高(很多主流浏览器不兼容) 最近发现主流浏览器都已经支持了这一变化 这一重要的变化,可能会让你发现,原生CSS从此变的异常强大~,下面看一下如何 ...

  5. Python的网络编程[1] -> FTP 协议[0] -> FTP 的基本理论

    FTP协议 / FTP Protocol FTP全称为File Transfer Protocol(文件传输协议),常用于Internet上控制文件的双向传输,常用的操作有上传和下载.基于TCP/IP ...

  6. 安装mysql数据库图文教程

    一.首先下载该版本的Mysql  5.5.28双击软件,弹出软件的安装界面如下 二.点击Next  ,点击同意

  7. 洛谷——P1469 找筷子

    P1469 找筷子 题目描述 经过一段时间的紧张筹备,电脑小组的“RP餐厅”终于开业了,这天,经理LXC接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘 ...

  8. [Usaco2010 Nov]Visiting Cows

    题目描述 经过了几周的辛苦工作,贝茜终于迎来了一个假期.作为奶牛群中最会社交的牛,她希望去拜访N(1<=N<=50000)个朋友.这些朋友被标号为1..N.这些奶牛有一个不同寻常的交通系统 ...

  9. 集合框架(02)List

    List的类型和特点: ArrayList:底层的数据结构使用的是数组结构.特点:查询的速度很快,但是增删稍慢 线程不同步 LinKedList:底层使用的链表数据结构.特点:增删的速度很快,查询稍慢 ...

  10. 4.NFC前台调度系统

    使用目的:当前Activity能直接响应NFC标签,而不需要用户在choose所有能处理的Activity. 使用步骤: 第一步:在onCreate()方法中,创建一个PendingIntent对象 ...