在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. 同余方程(NOIP2012)

    原题传送门 水~ 纯拓展欧几里得算法.. #include<iostream> #include<cstdio> #define ll long long using name ...

  2. 错误:'nasm' 不是内部或外部命令,也不是可运行的程序

    原文转自 http://blog.csdn.net/alexcrazy/article/details/7183312 >正在执行自定义生成步骤 >'nasm' 不是内部或外部命令,也不是 ...

  3. matlab默认字体设置

      Monospaced Plain 10 SansSerif Plain 10 这是默认设置.希望能帮到你!

  4. CyanogenMod编译

    1. 介绍 本文介绍了i9100手机CyanogenMod 13系统的编译方法 2. 系统要求 笔者使用的环境为CentOS-7-x86_64, 用来为i9100编译CM 13,之所以选择最新版的CM ...

  5. 华为上机测试题(MP3光标移动-java)

    PS:此题满分,可参考 描述: MP3 Player因为屏幕较小,显示歌曲列表的时候每屏只能显示几首歌曲,用户要通过上下键才能浏览所有的歌曲.为了简化处理,假设每屏只能显示4首歌曲,光标初始的位置为第 ...

  6. 自定义topo文件解析

    from mininet.topo import Topo from mininet.net import Mininet from mininet.util import dumpNodeConne ...

  7. Appium+python自动化20-查看iOS上app元素属性【转载】

    前言 学UI自动化首先就是定位页面元素,玩过android版的appium小伙伴应该都知道,appium的windows版自带的Inspector可以定位app上的元素Mac版的appium1.6的版 ...

  8. html5进阶之canvas图像基础

    1.首先还是使用之前讲过的Image()函数来预加载图像. 在调用图像之前,需创建一个事件监听器,为其保证图像已经正确的加载. 如下图: 监听图片已经正确加载 2.把图像显示在画布上面,这里将不再使用 ...

  9. 51nod 1007 正整数分组【01背包变形】

    1007 正整数分组 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 将一堆正整数分为2组,要求2组的和相差最小. 例如:1 2 3 4 5,将1 ...

  10. onWebView检查网页中文

    问题:要检查网页中的一段文本: 开始我是这样写的: private final static String SPECIFIED_TEXT = "这个是一段中文"; onWebVie ...