如何在 MATLAB 的 mex c++ 函数中循环遍历矩阵元素?

2024-01-16

我正在尝试使用 mex 来索引为 MATLAB 编写外部 C++ 函数来操作矩阵,但无法使用多维索引。有提供例子here http://www.mathworks.co.uk/help/matlab/matlab_external/table-of-mex-examples.html,但我还没有找到如何解决下面描述的问题。 我有一个样本矩阵:

>> mat
mat =
 1    10
 2    20
 3    30
 4    40
 5    50

目前我通过矩阵使用线性索引,其工作原理:

#include <mex.h>
#include <iostream>
using namespace std;
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
 //1.get pointer to input graph_list and allocate it    
    double *graph_list = mxGetPr(prhs[0]);
    mwSize mrows = mxGetM(prhs[0]);
    mwSize ncols = mxGetN(prhs[0]);  
    cout<< mrows<<" rows\n";
    cout<< ncols<<" cols\n";
    int mm, nn;
    for (nn=0;nn<ncols;nn++) {
        for (mm=0;mm<mrows;mm++){
            cout << graph_list[nn*(mrows) +mm]  <<"\n";            
        }
    }     
}

这会产生:

>> mexTryAlex(mat)    
5 rows
2 cols
1
2
3
4
5
10
20
30
40
50

当我更改 graph_list 的定义并尝试对 graph_list 进行 2D 索引时,出现编译错误mex:

double **graph_list = mxGetPr(prhs[0]);
cout << graph_list[nn][mm];

编辑:这是收到的错误消息

>> mex mexTryAlex.cpp
Warning: You are using gcc version "4.4.3-4ubuntu5)".  The version
     currently supported with MEX is "4.3.4".
     For a list of currently supported compilers see: 
     http://www.mathworks.com/support/compilers/current_release/
mexTryAlex.cpp: In function ‘void mexFunction(int, mxArray**, int, const mxArray**)’:
mexTryAlex.cpp:16: error: cannot convert ‘double*’ to ‘double**’ in initialization
mex: compile of ' "mexTryAlex.cpp"' failed.
??? Error using ==> mex at 208
Unable to complete successfully.

编译器说明了一切。

在 C 语言中,二维数组就像数组的数组。因此,2D 数组与 1D 数组有根本的不同;它是一个指针数组,其中每个元素都包含一个指向数组的指针(因此是一个双指针,double**).

你在问mxGetPr()返回一个double**,但它返回一个double*,例如,指向一维数组第一个元素的指针。该一维数组只能被索引linearly.

我的猜测是 MATLAB 这样做是为了保持索引数组的一致性——您真的期望/想要一个double****对于 4 维数组?

而且,mxGetPr()不能通过返回类型重载(毕竟是 C)。

为了能够对一维数组进行双索引,您可以潜入一个小宏:

#define A(i,j) A[(i) + (j)*numrows]

并像这样使用它

double *A = mxGetPr(...);
int numrows = 4;   /* or get with mxGetM() or so) */

double blah = A(3,2); /* call to MACRO */

显然,与所有宏一样,有一些事情需要注意:

  1. 没有边界检查
  2. C 是基于 0 的,而 Matlab 是基于 1 的,使得所有指数不同
  3. 所有数组都必须称为“A”

您可以编写一个函数来减轻这些缺点:

double getValue(double** array, int row, int* dims);

(or use mxCalcSingleSubscript正如所指出的Shai https://stackoverflow.com/a/16146795/1714410),但这并不能真正提高表达能力恕我直言:

double blah = getValue(array, 3,4, dims);
/* or the ugliness from mxCalcSingleSubscript(); */

您还可以用 C++ 编写,创建一个带有operator(),用指针和尺寸构造它mxGetPr() and mxGetDims()等等,在Matlab中编译使用g++或等效的,但这引入了一大堆其他问题,并且增加了比大多数情况所需的复杂性得多的方法。

因此,为了避免所有这些混乱,我总是就地计算索引:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 MATLAB 的 mex c++ 函数中循环遍历矩阵元素? 的相关文章

  • 简单的 C++ 线程

    我正在尝试在 C Win32 中创建一个线程来运行一个简单的方法 我是 C 线程的新手 但对 C 中的线程非常熟悉 这是我想做的一些伪代码 static void MyMethod int data RunStuff data void R
  • 对相当大的整数的大集合的操作的快速实现

    描述 我实现了以下类 LabSetInt64 参见下面的代码 这里的目标是尽可能快地操作大量大整数 最多 10M 的值 我的主要要求集中在 至关重要 尽快获取集合的大小 基数 重要 能够非常快速地迭代一组集合 所以 从下面的实现开始 我还有
  • 将 LINQ to Entities 查询中的每个项目转换为接口的最佳方法是什么?

    我有一个实现 IUser 的实体对象 User IQueryable
  • NUnit 测试运行顺序

    默认情况下 nunit 测试按字母顺序运行 有谁知道有什么方法可以设置执行顺序吗 是否存在这样的属性 我只是想指出 虽然大多数受访者认为这些是单元测试 但问题并没有具体说明它们是 nUnit 是一个很棒的工具 可用于各种测试情况 我可以看到
  • 如何获取任意类型的默认值

    在 C 中我可以写这样的东西 class AnyThing
  • 使用 boost::iterator_facade<>

    我有一个链表结构 struct SomeLinkedList const char bar int lots of interesting stuff in here DWORD foo SomeLinkedList pNext 它是现有
  • 设置外部应用程序焦点

    在 VB NET 中 您可以使用以下命令将焦点设置到外部应用程序 AppActivate Windows Name or AppActivate processID As Integer 现在 如果您这样做 则效果很好 Dim intNot
  • 在 DefaultHttpContext 上使用 FeatureCollection 时,响应对象为 null

    我正在测试一些 net Core 中间件 并希望使用整个 asp net Core http 管道来运行中间件 而不是模拟它 问题是 当我使用特征集合时 不知何故 响应对象没有在 httpRequest 中设置 并且它在请求本身上是只读的
  • 让 GCC/Clang 使用 CMOV

    我有一个简单的标记值联合 这些值可以是int64 ts or doubles 我正在对这些联合进行加法 但需要注意的是 如果两个参数都代表int64 t值 那么结果也应该有一个int64 t value 这是代码 include
  • 如何忽略搜索条件中的空属性

    我有一个不好的要求要做 无论如何 我必须在我的应用程序中实现它 我有一个Track class public class Track public string Name get set public string City get set
  • 复杂的 C 声明

    我刚刚在互联网上浏览了一些代码 发现了这个 float foo SIZE SIZE 我如何阅读这份声明 是否有一套特定的规则来阅读如此复杂的声明 我有一段时间没做这个了 从 开始foo然后向右走 float foo SIZE SIZE fo
  • DLL 中的 XP 风格组合框

    我需要使用 C 和 WIN32 API 无 MFC 在 DLL 中创建 XP 风格的组合框 我设法在 DLL 中创建控件 不是以 XP 风格 我设法在带有清单的 exe 中创建 XP 样式组合框 但它在 DLL 中不起作用 为了让您的 DL
  • 如何在 C# 中通过 JavaScript 回调运行 QUnit 测试并获取测试结果?

    在我的几个项目中 我使用 MVC 模式将代码 关注点 分为 3 层 模型层和控制层都在 C 上运行 因此我使用 MSTest 或 NUnit 等测试框架来验证这些层的功能需求 对于视图层 我使用 QUnit 来测试 JavaScript 文
  • MPI_Gatherv:根数组中收到的垃圾值

    我正在尝试实施MPI Gatherv函数于C 根据我的程序 包括 root 在内的每个进程都应该创建一个大小等于 进程的等级 1 这将在所有单元格中保持进程的等级 然后这个本地数组被收集到根的 rcv array 中 不知何故 我得到了垃圾
  • 如何从句柄确定进程是 32 位还是 64 位?

    如何从使用 OpenProcess 获取的进程句柄中获取信息 无论进程是 32 位还是 64 位 是的 IsWow64Process 毫无用处 令人烦恼 它的真正意思是 启用了 32 位模拟 如果您在 32 位操作系统上运行 则返回 fal
  • 使用 foreach 进行复杂的多维关联数组处理

    我不得不再次问这个问题 抱歉 但我在尝试处理这个数组时遇到了问题 我尝试了几种不同的方法 但没有一个是正确的 这是数组 Array search gt Array response gt Array errors gt number of
  • C# 记录类型:记录子类之间的相等比较

    给定父记录类型 public record Foo string Value 和两个记录子类Bar and Bee我想知道是否可以实施Equals在基类中 因此 Foo Bar 或 Bee 的实例都被考虑equal基于Value 两者都与E
  • 即使对于新上下文,OnModelCreating 也仅调用一次

    我有多个相同但内容不同的 SQL Server 表 在编写代码优先 EF6 程序时 我尝试为每个程序重用相同的数据库上下文 并将表名称传递给上下文构造函数 然而 虽然每次都会调用构造函数 但尽管每次都是从 new 创建数据库上下文 但 On
  • 通过 OCI 调用 Oracle 存储过程并使用 C++ 中的 out ref 游标返回结果

    我想使用 OCI 接口从 C 调用 Oracle 存储过程 并使用 out SYS REF CURSOR 作为过程的参数来迭代结果 我是 OCI 新手 所以可能会遗漏一些简单的东西 大部分代码取自这里 我的存储过程是 CREATE OR R
  • 字符串常量之前应有非限定 ID

    我目前正在编写一个 C 应用程序 它与 math h 结合实现了振荡器 我拥有的代码应该可以很好地用于该应用程序 尝试编译目标文件 但是我遇到编译器错误 很可能与语法 等有关 我认为这与命名空间有关 错误 终端输出 User Name Ma

随机推荐

  • 在基础对象中构造派生类型的对象

    vb net 中是否可以有一个方法来构造 bass 类中任何派生类的对象 在此代码中 x Clone 应返回一个 Bar 对象 这是使用两种不同对象类型在两个类中重复代码的唯一方法 Module Module1 Sub Main Dim x
  • .NET:我可以使用 DataContractJsonSerializer 序列化为 JSON 关联数组吗?

    使用时数据契约Json序列化器 http msdn microsoft com en us library system runtime serialization json datacontractjsonserializer aspx序
  • cellForRowAtIndexPath 返回 nil

    我正在尝试从表格视图中获取特定的单元格 以便我可以更改它的标签并停止活动指示器 我遇到的问题是cellForRowAtIndexPath返回零 我的表视图只有 1 行 Code id initWithNibName NSString nib
  • Android Thread.sleep 有时等待时间太长

    Edit 这里不是说精度问题 从下面的代码和日志可以看到 我请求休眠1秒 但结果差不多是200秒 有时会跳到600秒 这不可能是精度问题 我之前使用过 handlerthread 有时发布到处理程序的作业没有按时启动 为了获得更多详细信息
  • 如何在 Android 中以编程方式启动主屏幕 [重复]

    这个问题在这里已经有答案了 我想用我的应用程序启动 Android 的主屏幕 主要目标是当用户按下专用键时向用户显示所有应用程序 其实 方式并不重要 有想法这样做吗 这是启动 HomeActivity 的代码 Intent startMai
  • devDependency 会影响包大小吗?

    我仔细寻找 找不到这个问题的直接答案 执行我添加的软件包devDependencies实际上最终会出现在生产包 JS 文件中并从而影响其大小 或者只是dependencies进入捆绑包 不 它不会影响您的包大小 因为这些包仅在开发模式下使用
  • ActiveRecord 嵌套 SELECT

    我需要有关 SELECT FROM 嵌套 SELECT 的帮助 如何以 ActiveRecord 方式重写以下查询并获取 Relation 对象 SELECT candidates FROM SELECT candidates first
  • stringr、str_extract:如何进行正向后查找?

    很简单的问题 我只需要使用正则表达式正向查找捕获一些字符串 但我没有找到一种方法来做到这一点 这是一个例子 假设我有一些字符串 library stringr myStrings lt c MFG acme something else M
  • 具有重叠间隔时间序列的 groupby

    我在 python pandas dataframe 对象中有一个时间序列 我想根据索引创建一个组 但我想要重叠的组 即组不不同 header sec 是索引列 每组包含一个 2 秒的窗口 输入数据帧 header sec 1 17004
  • 如何在处理中计算从 mouseX、mouseY 到矩形的距离()

    如果它是一个点的距离 那就是 dist mouseX mouseY x y for point x y 但我如何计算从鼠标当前位置到 rectMode CORNERS rect x1 y2 x2 y2 Thanks 像这样的事情应该这样做
  • 如何调整滚动复合材料的大小以使其始终水平适合其内容?

    我有一个滚动复合材料 它包含一个 tableViewer 我的要求是 如果表格宽度增加 滚动组合不应显示水平滚动 但应扩展以适合表格的大小 我在这里使用滚动复合的唯一原因是我想显示垂直滚动条 如果你想控制滚动条Table在 SWT 中 它是
  • 将动画 Maya 模型转换为 JSON 以与三个 js 一起使用

    我有一个在 Maya 2008 中完成的 Maya 模型 我需要能够将其转换为 JSON 格式以便与三个 js 一起使用 到目前为止 我已经尝试过 1 ThreeJsFileTranslator py 它是一个用于导出模型的 Maya 插件
  • 如何在telnet客户端上实现命令历史记录? (向上/向下箭头)

    我有一台接受 telnet 连接进行管理的服务器 我错过了命令历史记录 因此我想让我的 telnet 会话支持它 我的问题 1 我是否必须在服务器端实现这一点 以便服务器将过去的命令发送到客户端 然后客户端可以重新执行 2 是否有办法在te
  • PHP < 5.2 的 spl_object_hash (对象实例的唯一 ID)

    我正在尝试获取 PHP 5 中对象实例的唯一 ID 功能 spl object hash http php net manual en function spl object hash php从 PHP 5 2 开始可用 但我想知道是否有针
  • 为什么 Coffeescript 认为影子是一个坏主意

    我想切换到 Coffeescript 一段时间了 昨天我以为我终于被卖了 但后来我偶然发现阿明 罗纳彻文章 http lucumr pocoo org 2011 12 22 implicit scoping in coffeescript
  • 为什么我无法在 jquery 1.4.4 之后设置背景位置动画?

    I see here https stackoverflow com questions 5075368 jquery and animate backgroundposition no longer works in version 1
  • Tensorflow安装OS X

    我正在尝试在 El 10 11 1 上安装 TensorFlow 但在创建和安装 pip 包时遇到问题 我根本不理解 我成功安装了 Bazel SWIG 和 NumPy按照说明 http tensorflow org get started
  • 从格子直方图中提取值

    我使用创建了一个等面积直方图histogram 然而 在格子中 我似乎找不到一种方法来提取 20 个大小相等的箱中的值 有什么建议么 我也研究过使用 ggplot2 但我无法创建相同面积大小的数据箱 同时具有使用提取数据的能力ggplot
  • MySQL的index_length是以字节为单位的吗?

    MySQL文档将index length定义为 索引文件的长度 但没有指定单位 是字节吗 http dev mysql com doc refman 5 1 en show table status html http dev mysql
  • 如何在 MATLAB 的 mex c++ 函数中循环遍历矩阵元素?

    我正在尝试使用 mex 来索引为 MATLAB 编写外部 C 函数来操作矩阵 但无法使用多维索引 有提供例子here http www mathworks co uk help matlab matlab external table of