Matlab中特征向量间距离矩阵的并行mex程序
在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程序的更多相关文章
- MEX程序中的mexFunction函数【转】
与C中的main函数一样,MEX程序中的开始函数为mexFunction.默认变量参数是: void mexFunction(int nlhs, mxArray *plhs[], int nrhs, ...
- matlab中 mcc、mbuild和mex命令详解
先简单的说说mcc.mbuild和mex到底怎么回事: mcc将M文件转换成C/C++文件和相应的MEX包裹文件(需要Matlab编辑器),但在特定条件下可以自动调用mbuild或者mex mex将C ...
- matlab中 mcc/mbuild/mex 区别
mcc 的作用是将 .m文件编译为 c/c++动态链接库文件,使你可以在 c/c++程序中使用 matlab的一些函数功能.mcc 也可以将.m文件编译为exe可执行文件. mex 的作用是将 c/c ...
- 为什么安装了MinGW之后,还是不能在Matlab中使用mex?
原文地址:http://blog.sina.com.cn/s/blog_53c7b1580102xjcw.html 老版本的Matlab自带lcc,在Matlab中输入mex -setup就可以选择. ...
- matlab中help所有函数功能的英文翻译
doc funname 在帮助浏览器中打开帮助文档 help funname 在命令窗口打开帮助文档 helpbrowser 直接打开帮助浏览器 lookfor funname 搜索某个关键字相关函数 ...
- matlab中fft快速傅里叶变换
视频来源:https://www.bilibili.com/video/av51932171?t=628. 博文来源:https://ww2.mathworks.cn/help/matlab/ref/ ...
- matlab中patch函数的用法
http://blog.sina.com.cn/s/blog_707b64550100z1nz.html matlab中patch函数的用法——emily (2011-11-18 17:20:33) ...
- 【matlab】将matlab中数据输出保存为txt或dat格式
将matlab中数据输出保存为txt或dat格式 总结网上各大论坛,主要有三种方法. 第一种方法:save(最简单基本的) 具体的命令是:用save *.txt -ascii x x为变量 *.txt ...
- 将matlab中数据输出保存为txt或dat格式
:FID= FOPEN(filename,permission) 用指定的方式打开文件 FID=+N(N是正整数):表示文件打开成功,文件代号是N. FID=-1 : 表示文件打 ...
随机推荐
- zepto方法
1.$.inArray $.inArray v1.0+ $.inArray(element, array, [fromIndex]) ⇒ number 搜索数组中指定值并返回它的索引(如果没有找到则返 ...
- Pandas之DataFrame——Part 1
''' [课程2.] Pandas数据结构Dataframe:基本概念及创建 "二维数组"Dataframe:是一个表格型的数据结构,包含一组有序的列,其列的值类型可以是数值.字符 ...
- python类中两个列表实例如何相加或相减
如下 import numpy a = [1, 2, 3, 4] b = [5, 6, 7, 8] a_array = numpy.array(a) b_array = numpy.array(b) ...
- Java并发(1)- 聊聊Java内存模型
引言 在计算机系统的发展过程中,由于CPU的运算速度和计算机存储速度之间巨大的差距.为了解决CPU的运算速度和计算机存储速度之间巨大的差距,设计人员在CPU和计算机存储之间加入了高速缓存来做为他们之间 ...
- Relation(NOIP模拟赛)(二分图染色)
原题: Description 有n个人,编号为1àn,告诉你那些人之间是不友好的.现在,让你将这n个人分成两组,使得每一组之内的人是互相友好的,如果可以分成两组,则输出如何分组的,如果不可以分成两组 ...
- ScrollLayer
http://www.oschina.net/p/scrolllayer ScrollLayer 编辑/纠错 分享到: 已用 +1 收藏 +12 4月18日 武汉 源创会开始报名,送华为开 ...
- v4l2驱动文档之——streaming IO【转】
转自:http://blog.csdn.net/zoe6553/article/details/17715441 v4l2驱动编写篇第六B--流输入输出 在本系列文章的上一期中,我们讨论了如何通过re ...
- VS2013 更改MFC标题栏图标和生成的执行文件图标
创建一个新工程,可以什么都不加.打开.rc, 创建或打开Icon资源(以下都以Icon为例). 单击工程窗口的资源视图标签,选中资源ID为IDR_MAINFRAME图标资源,然后按Delet ...
- 流畅的python第九章笔记 python风格的python
9.1对象表示形式 __repr__和__str__这两个方法都是用于显示的,__str__是面向用户的,而__repr__面向程序员. 我们打印下面的A是默认输出这个对象的类型,我们对B进行了修改_ ...
- HDU 3237 Tree(树链剖分)(线段树区间取反,最大值)
Tree Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 9123 Accepted: 2411 Description ...