【发布时间】:2016-04-07 17:37:32
【问题描述】:
如果我是第一次发帖,我希望我能达到标准...
出于效率的原因,我正在将一个最初用 MATLAB 编写的程序翻译成 c++(我对此很陌生)。我实际上正在处理的一段代码在一个步骤中恢复了对向量(矩阵)的各种索引的访问。例如,如果 M1 是一个大小为 10x15 的矩阵,程序将定义一个新的矩阵,如下所示:
idxs1 = [1 2 3];
idxs2 = [1 2 3 4 5];
M2 = M1 (idxs1 , idxs2);
将 M2 生成为大小为 3x5 的矩阵。现在,我猜MATLAB实际上所做的就是逐个访问由索引给出的M1的各个位置,然后通过重新排列获取的许多内容来构造M2,这一切都非常有效。
我的问题是,如何在 c++ 中重现这种机制?据我所知,没有直接的方法可以连续访问数组的各种索引,而且我使用的for 循环似乎相当麻烦。也许有一些聪明的方法可以做到这一点而不需要“太多”的处理器时间?另外,出于教育目的,如果有人可以解释执行此类操作时 MATLAB 实际执行的操作,我将不胜感激。
提前致谢,给您带来的不便深表歉意!
P.S:以防万一它增加了问题,我正在使用 MEX 文件来链接两种语言。 P.S2:顺便说一句,我发现了一些相关的问题,但与其他语言有关:
【问题讨论】:
-
你将很难提高 Matlab 的效率。
-
您为什么认为在效率方面击败 Matlab 会很容易? Matlab主要使用BLAS和LAPACK进行矩阵运算。这些库最初是用 fortran 编写的。您可以通过使用一些c wrappers 来使用这些功能。 Matlab 还使用称为 mxArray 的矩阵类型。我想可以使用其他矩阵库,但除非你是一个无聊的数学天才,否则你应该避免自己写。
-
C++ 矩阵库与non-contiguous submatrix views。还有一个 MEX 界面
-
非常感谢您提供的有用答案。我错误地表达了自己,暗示我试图击败 MATLAB =) 我实际上正在做的是翻译成 C++ 以便之后跳转到 CUDA。也就是说,事实证明我的程序实际上比 MATLAB 运行得更快,但前提是系统的大小“足够小”,MATLAB 在更大的系统(即矩阵)上击败了我的实现,而且,占用的数量大致相同时间不管大小。这是我希望通过犰狳复制的智能编码(不是我)的成就。感谢您的回答! =)
标签: c++ arrays matlab matrix matrix-indexing