小编Ita*_*atz的帖子

Matlab变量在复制并传递给mex文件时显示"类似引用"的行为

我有一个mex文件(在VS2010中编译,Matlab 2010b),它接受一个变量,然后更改它.例如,在mex文件中,它看起来像:

double *fp = (double *)mxGetPr (prhs[0]);
*fp = someDoubleValue;
Run Code Online (Sandbox Code Playgroud)

为了比较Matlab实现和mex实现,我在调用mex文件之前复制了变量:

var_mex = var;
mymex (var_mex);
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,这两个var_mexvar变化(至当然相同的值),因为如果我创建一个参考var,而不是它的一个副本.

这是一个已知的问题?我怎样才能说服Matlab复制变量?

编辑

因为我怀疑这个问题是Matlab优化其内存管理的结果,所以var在调用mex文件之前我做了一些"什么都不做"的计算,即

var=var+1;
var=var-1;
Run Code Online (Sandbox Code Playgroud)

确实它解决了这个问题.如果有人遇到它,我仍然很乐意得到一些关于此的信息(或其他建议).

c matlab mex visual-studio-2010

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

iOS 5中的规范音频样本数据类型是什么

在iOS 5.0文档中,声明规范音频数据类型是16位符号int(链接):

用于输入和输出的规范音频数据样本类型.

typedef SInt16 AudioSampleType;

讨论

iPhone OS中用于输入和输出的规范音频样本类型是具有16位整数样本的线性PCM.

但是,如果我右键单击"跳转到定义",AudioSampleType我会看到以下定义CoreAudioTypes.h:

#if !CA_PREFER_FIXED_POINT
typedef Float32     AudioSampleType;
typedef Float32     AudioUnitSampleType;
#else
typedef SInt16      AudioSampleType;
typedef SInt32      AudioUnitSampleType;
#define kAudioUnitSampleFractionBits 24
#endif
Run Code Online (Sandbox Code Playgroud)

CA_PREFER_FIXED_POINT我看到跳转到def时:

#if !defined(CA_PREFER_FIXED_POINT)
    #if TARGET_OS_IPHONE
        #if (TARGET_CPU_X86 || TARGET_CPU_X86_64 || TARGET_CPU_PPC || TARGET_CPU_PPC64) && !TARGET_IPHONE_SIMULATOR
            #define CA_PREFER_FIXED_POINT 0
        #else
            #define CA_PREFER_FIXED_POINT 1
        #endif
    #else
        #define CA_PREFER_FIXED_POINT 0
    #endif
#endif
Run Code Online (Sandbox Code Playgroud)

在运行时检查我的代码,我发现CA_PREFER_FIXED_POINT在模拟器和iPod上都定义为1.

所以,我的问题:

  • 什么规范类型?它总是 SInt16在设备上吗?
  • 在什么情况下,上面的第3行评估为'true'?我的意思是,哪个设备运行iPhone OS并使用列出的CPU之一?
  • 是否有一个用例我应该重新定义CA_PREFER_FIXED_POINT …

iphone audio core-audio ios

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

枚举值的行为类似于全局变量吗?

我有两个枚举,如果一个枚举中有一个值与另一个枚举中的值相同:

enum A {joe, bob, doc};
enum B {sunday, monday, doc};
Run Code Online (Sandbox Code Playgroud)

编译器(Visual Studio)抱怨重新定义doc,这意味着它将其视为全局变量.是这样吗?这不是我期望的行为,它迫使我管理项目中所有枚举元素的名称.

任何见解都会有所帮助.

c++ enums

5
推荐指数
4
解决办法
7127
查看次数

函数模板的显式实例化失败 (g++)

我在显式实例化函数模板时遇到了一些问题(即链接错误)。在 Visual Studio 下项目链接正常,只有在 g++/Unix 下,使用 Eclipse-CDT,链接产生错误。

在一个大项目中,函数调用是静态库的一部分,它与动态库链接。该函数的架构如下:

  • 在我的MathUtils.h文件的命名空间内声明(但未实现)的函数模板。函数参数之一本身就是一个结构模板,它在这个文件中声明实现h(在相同的命名空间下)。
  • 函数实现和实例化在MathUtils.cpp.
  • 函数调用在someFile.cpp(当然是哪个#include "MathUtils.h")中,它作为静态库的一部分被编译和链接。

让我(几乎)发疯的事情是构建错误不能完全重现,我怀疑 Eclipse 是罪魁祸首(可能跳过了一些步骤,尽管我clean project在每次构建之前使用)。

大约一个小时,调试配置构建无错误,但发布失败并出现undefined reference to...链接错误。然后,在接下来的一个小时里,两种配置都失败了。然后我做了一个小项目,只有上面提到的 3 个文件,并从命令行和 Eclipse 编译它 - 根本没有错误。现在这两种配置似乎都可以正常链接。

有没有人在使用 Eclipse-CDT 时遇到过类似的问题?有什么建议?

编辑:由于问题不容易(或根本)重现,我想很难得到答案。如果我有任何新的见解,我会更新。

c++ gcc templates g++ eclipse-cdt

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

两组可能不同尺寸之间的距离测量

我有2组整数,A和B,不一定大小相同.根据我的需要,我将每个2个元素a和b(整数)之间的距离变为公正abs(a-b).

我定义了两组之间的距离如下:

  1. 如果集合具有相同的大小,则最小化所有对[a,b](a中的a和b中的a和b)的距离之和,最小化所有可能的"对分区"(有n个可能的分区).
  2. 如果这些集合的大小不同,那么假设大小为m的A和大小为n的B,其中m <n,则最小化距离(1)在大小为m的B的所有子集上的距离.

我的问题是,根据上面的定义,以下算法(只是一个直观的猜测)给出了正确的答案.

  • 构造一个D大小矩阵m X n,用D(i,j) = abs(A(i)-B(j))
  • 找到最小元素D,累积它,并删除该元素的行和列.累计下一个最小的条目,并继续累积,直到删除所有行和列.

例如,如果A={0,1,4}B={3,4},那么D(使用上面和左边的元素):

3 4

0 3 4

1 2 3

4 1 0

而距离是0 + 2 = 2,从配对来44,并31.

algorithm distance set

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

使用Eclipse CDT调试问题 - 执行和GUI未对齐

我正在使用Eclipse CDT在Ubuntu中调试C++项目.GUI,即显示要执行的下一行源代码的小箭头,与实际执行不对齐.具体来说,它比实际执行线低约30行.我通过检查局部变量的值以及它们何时发生变化来确定实际线路是什么.

我已经尝试多次清理项目,包括手动删除所有编译的对象代码,库等,希望它会导致Eclipse自行更新,但它坚持显示错误的行.

任何帮助表示赞赏.

c++ eclipse gdb eclipse-cdt

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

在连续调用generate_n之间不保留Functor的实例变量

我使用以下结构作为STL generate_n算法的输入:

struct GenerateNumber {     
    GenerateNumber () : i(0) {}
    int operator () (void) {        
        return  i++;
    }
private:
    int i;
};
Run Code Online (Sandbox Code Playgroud)

使用此仿函数的代码示例如下:

std::vector <int> v1 (3);
std::vector <int> v2 (3);
GenerateNumber generateNumber;
std::generate_n (v1.begin (), 3, generateNumber);
std::generate_n (v2.begin (), 3, generateNumber);
Run Code Online (Sandbox Code Playgroud)

但是,结果是既包含v1v2包含{0,1,2},而不是v2包含{3,4,5}.我已经用断点验证了GenerateNumber构造函数只被调用一次(我知道构造函数被调用的次数没有多少,但我还是检查了它).

我知道我可以通过制作i静态来解决这个问题,但我不明白这种行为.为什么i连续通话之间没有保持价值?

c++ stl functor

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

在imagesc上使用透明度值

当我在使用imagesc(Matlab R2012a)创建的图像上绘制透明度<1的补丁时,我得到的东西看起来像很多"刻度标签",或者是沿着轴的图像上的数字.以下代码重现了该问题:

imagesc(rand(10,20))
hold on
patch([5 5 15 15],[3 7 7 3],'r','facealpha',.5)
Run Code Online (Sandbox Code Playgroud)

这是一个错误,还是有办法正确地做到这一点?

编辑 如果我设置set(gca,'xtick',[],'ytick',[]),数字会消失,所以它确实与刻度相关.我当然更喜欢在我的身材上打勾.

imagesc上有数字

matlab plot

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

bsxfun-like用于矩阵产品

我需要将矩阵A与n个矩阵相乘,然后得到n矩阵.例如,将2x2矩阵与3个2x2矩阵相乘,堆叠为2x2x3 Matlab数组.bsxfun我通常用于这种情况,但它只适用于元素操作.我可以这样做:

blkdiag(a, a, a) * blkdiag(b(:,:,1), b(:,:,2), b(:,:,3))
Run Code Online (Sandbox Code Playgroud)

但我需要一个任意的解决方案n- ?

matlab matrix-multiplication bsxfun

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

从函数调用dbstep

我正在尝试编写我的Matlab调试步骤命令版本dbstep,即我想在一次调用中执行dbstep和其他一些操作.但是,放入dbstep函数不起作用:

% in file my_dbstep.m
function my_dbstep()
evalin('caller', 'dbstep'); 
Run Code Online (Sandbox Code Playgroud)

当我my_dbstep在调试会话中调用时,它就像我dbstep在函数内输入一样,而不是在调用者中输入.

还有其他解决方案吗?

debugging matlab

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