小编Bil*_*ham的帖子

链接MATLAB Mex库中的错误

我正忙着编写一个MATLAB Mex库 - 特别是来自这个网站的'Correlation Clustering Optimization'代码.

我想在OSX机器上编译,并使用提供的mexall函数.这将运行以下行:

mex -O -largeArrayDims CXXFLAGS="\$CXXFLAGS -Wno-write-strings" QPBO.cpp QPBO_extra.cpp QPBO_maxflow.cpp QPBO_wrapper_mex.cpp QPBO_postprocessing.cpp -output QPBO_wrapper_mex
Run Code Online (Sandbox Code Playgroud)

链接时将错误发生在以下输出到MATLAB命令行:

ld: duplicate symbol QPBO<int>::GetMaxEdgeNum()    in QPBO_extra.o and QPBO.o
collect2: ld returned 1 exit status

    mex: link of ' "QPBO_wrapper_mex.mexmaci64"' failed.
Run Code Online (Sandbox Code Playgroud)

从此判断,功能GetMaxEdgeNum出现在QPBO_extra.oQPBO.o.但是,它实际上只在头文件中定义QPBO.h.因此,我怀疑包含它的两个源文件都将其作为符号包含在其目标文件中,从而导致链接时出现问题.

(更多信息:每个源文件还包含文件#include "instances.inc"末端的文件.instances.inc显然似乎包含模板化的一些特定实例QPBO.)

我在这里犯了一个明显的错误吗?我该怎么做才能增加编译代码的机会?

编辑

这是有问题的GetMaxEdgeNum函数的定义QPBO.h:

template <typename REAL> 
    inline int QPBO<REAL>::GetMaxEdgeNum() 
{
    return (int)(arc_max[0]-arcs[0])/2;
} …
Run Code Online (Sandbox Code Playgroud)

c++ macos matlab linker-errors mex

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

在一行中多次递增一个MATLAB数组的值

这是一个关于在同一语句中多次递增MATLAB数组的一个值的问题,而不必使用for循环.

我将我的数组设置为:

>> A = [10 20 30];
Run Code Online (Sandbox Code Playgroud)

然后运行:

>> A([1, 1]) = A([1, 1]) + [20 3]

A =

    13    20    30
Run Code Online (Sandbox Code Playgroud)

显然,20被忽略了.但是,我希望它被包括在内,以便:

>> A = [10 20 30];
>> A([1, 1]) = A([1, 1]) + [20, 3]
Run Code Online (Sandbox Code Playgroud)

会给:

A =

    33    20    30
Run Code Online (Sandbox Code Playgroud)

是否有一个函数允许以一种漂亮的矢量化方式完成它?

(实际上,对数组的索引将包括多个索引,因此它可能是[1 1 2 2 1 1 1 1 3 3 3]等等,并且数字数组将以[20, 3]相同的长度递增(以上).)

arrays matlab increment vectorization

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

在分析过程中如何存储我的大型MATLAB数据文件?

在MATLAB中处理点云数据时遇到"数据过载"问题.这就是我目前正在做的事情:

  1. 我从我的原始数据文件开始,每个文件大约为30Mb.
  2. 然后我对它们进行初始处理以提取n个单独的对象并移除外围点,这些点都被组合成1 xn结构testset,保存到testset.mat (~100Mb).

    到现在为止还挺好.现在事情变得复杂了:

  3. 对于每个对象中的每个点testset,我将计算一些特征中的一个,最终成为某个大小的矩阵(对于每个点).矩阵的大小和计算的一些其他属性是计算的参数.我将这些计算出的特征保存在1 xn单元阵列中,每个单元格包含每个点的矩阵数组.

    然后,我将此单元格数组保存在一个.mat文件中,其中名称指定参数,使用的测试数据的名称以及提取的特征类型.例如:

    testset_feature_type_A_5x5_0.2x0.2_alpha_3_beta_4.mat

  4. 现在,对于每个这些文件,我然后进行一些进一步的处理(使用分类算法).再次设置更多参数.

所以现在我处于一个棘手的情况,初始数据的每一个最后一段都通过一些路径,但所采用的路径(以及沿该路径设置的参数)本身并不与数据本身保持一致.

所以我的问题是:

有一个更好的方法吗?任何在MATLAB中使用大型数据集的经验的人都能提出一种更有效地存储数据和参数设置的方法吗?

理想情况下,我可以在不必对文件字符串使用正则表达式的情况下查找某个数据 - 但是还有动机将单独处理的文件分开以便在加载它们时保存系统内存(并帮助防止损坏) ).

每次计算所花费的时间(约2小时)禁止"即时"计算数据.

matlab data-structures

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

从MATLAB GUI中删除标题栏以进行全屏显示

我创建了一个MATLAB GUI,我想显示它,以便它填满整个屏幕.目前,标题栏显示在最顶层.有没有办法隐藏这个标题栏?

我考虑过为此目的使用psychtoolbox,它允许全屏显示,但这不允许包含标准的MATLAB GUI元素,因为我理解它.

(如果它很重要,那就是OSX.在显示GUI全屏之前,我显然会隐藏菜单栏.)

matlab user-interface fullscreen

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

如何在Qt中为RGB888图像设置QImage像素颜色

我有一个RGB888格式的qImage定义如下:

myQrgb = QImage(img_in, width, height, QImage::Format_RGB888);
Run Code Online (Sandbox Code Playgroud)

我想改变特定的像素值,所以我按照这里的例子,如下:

QRgb value = qRgb(0, 0, 0);
myQrgb.setPixel(i, j, value);
Run Code Online (Sandbox Code Playgroud)

然而,无论i和j的值如何,这总是产生分段错误(例如,i = j = 2).

我猜它是因为我错误地使用QRgb操纵像素QImage::Format_RGB888.我该怎么做呢?

rgb qt qimage pixel-manipulation

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

使用VTK绘制不同颜色的点

我想使用Visualization Toolkit来分散绘图点,每个绘图点都有不同的颜色.我已经使用了这里给出的建议来绘制灰色的点,但我不明白如何为每个点赋予颜色.

多维数据集示例的相关部分是:

vtkPolyData *cube = vtkPolyData::New();
vtkPoints *points = vtkPoints::New();
vtkCellArray *polys = vtkCellArray::New();
vtkFloatArray *scalars = vtkFloatArray::New();

// Load the point, cell, and data attributes.
for (i=0; i<8; i++) points->InsertPoint(i,x[i]);
for (i=0; i<6; i++) polys->InsertNextCell(4,pts[i]);
for (i=0; i<8; i++) scalars->InsertTuple1(i,i);

// We now assign the pieces to the vtkPolyData.
cube->SetPoints(points);
points->Delete();
cube->SetVerts(polys);
polys->Delete();
cube->GetPointData()->SetScalars(scalars);
scalars->Delete();
Run Code Online (Sandbox Code Playgroud)

我怎样才能给每个Verts一个颜色?

c++ scatter-plot vtk point-clouds

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

从另一个启动一个C++应用程序,并与之通信

我有一个C++(技术上是MATLAB mex)程序,我打算用它在我的系统上启动一个独立的纯C++ slave程序.主调用程序可能如下所示:

void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[]){
    system ("path/to/slave/program");
}
Run Code Online (Sandbox Code Playgroud)

一旦从站启动,我就会想要第二个mex程序,它将与从程序通信并将数据发送到从程序.发送的数据将采用大型C++数组的形式.

我想我需要对slave程序(可能是它的pid?)进行某种处理,这是一种发送消息的方法,并且可以说是奴隶程序监听传入消息的一种方式.

我没有经验可以让单独的C++程序相互通信,所以在这方面的任何提示都会受到赞赏.此外,如果有任何特定的MATLAB mex特定警告,我很想知道这些.


编辑:我应该提到我正在Ubuntu上构建这个,但最终会喜欢它在所有平台上工作.平台特定的建议非常受欢迎,但多平台的想法真的是我追求的.

c c++ matlab system-calls mex

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

MATLAB的gpuArray; 计算能力不足

我在2年前的Macbook Pro上在Ubuntu 12.04上运行MATLAB R2011b.我想利用MATLAB的GPU功能.但是,当我尝试时,我发现我的GPU看起来不够强大:

>> gpuArray(rand(10))
Error using gpuArray (line 28)
No device supporting CUDA was found.

>> gpuDevice
Warning: The device selected (device 1, "GeForce GT 330M") does not have sufficient compute
capability to be used. Compute capability 1.3 (or greater) is required, the selected device
has compute capability 1.2. 
Run Code Online (Sandbox Code Playgroud)

这是否意味着我永远不能在我的机器上使用MATLAB的GPU功能?有哪些替代方案?

parallel-processing ubuntu matlab cuda gpu

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