Questions tagged «matlab»

MATLAB是MathWorks开发的用于数值计算和可视化的高级语言和交互式编程环境。请勿同时使用[matlab]和[octave]标签,除非问题明确涉及两者之间的相似性或差异。使用此标签时,请提及您正在使用的MATLAB版本(例如R2017a)。


14
如何在MATLAB中处理函数参数的名称/值对
我有一个函数,将可选参数作为名称/值对。 function example(varargin) % Lots of set up stuff vargs = varargin; nargs = length(vargs); names = vargs(1:2:nargs); values = vargs(2:2:nargs); validnames = {'foo', 'bar', 'baz'}; for name = names validatestring(name{:}, validnames); end % Do something ... foo = strmatch('foo', names); disp(values(foo)) end example('foo', 1:10, 'bar', 'qwerty') 似乎在提取适当的值时需要付出很多努力(而且再次使用错误指定的输入仍然不是特别可靠)。有没有更好的方法来处理这些名称/值对?MATLAB附带有任何帮助程序功能吗?

6
为什么在MATLAB中24.0000不等于24.0000?
我正在编写一个程序,需要删除存储在矩阵中的重复点。问题是,当检查这些点是否在矩阵中时,MATLAB无法识别它们是否存在(尽管它们存在)。 在以下代码中,intersections函数获取交点: [points(:,1), points(:,2)] = intersections(... obj.modifiedVGVertices(1,:), obj.modifiedVGVertices(2,:), ... [vertex1(1) vertex2(1)], [vertex1(2) vertex2(2)]); 结果: >> points points = 12.0000 15.0000 33.0000 24.0000 33.0000 24.0000 >> vertex1 vertex1 = 12 15 >> vertex2 vertex2 = 33 24 结果中应消除两个点(vertex1和vertex2)。应该通过以下命令完成: points = points((points(:,1) ~= vertex1(1)) | (points(:,2) ~= vertex1(2)), :); points = points((points(:,1) …

5
Matlab向量化-单元格的非零矩阵行索引
我正在与Matlab合作。 我有一个二进制方阵。对于每一行,都有一个或多个1。我想遍历此矩阵的每一行,并返回这些1的索引,并将其存储在单元格的条目中。 我想知道是否有一种方法可以不循环遍历该矩阵的所有行,因为在Matlab中循环确实很慢。 例如我的矩阵 M = 0 1 0 1 0 1 1 1 1 然后最终,我想要类似 A = [2] [1,3] [1,2,3] A细胞也是如此。 是否有一种无需使用for循环即可实现此目标的方法,目的是更快地计算结果?

1
升级到macOS Mojave后,MATLAB不再卸载MEX文件
在MATLAB中,clear mex从内存中卸载所有MEX文件(除非它们已被锁定)。在macOS的早期版本下,我只需发出clear mex命令即可重新编译MEX文件并运行修改后的版本,而无需重新启动MATLAB 。在莫哈韦沙漠下,这不再可能。 例如,使用以下简单的MEX文件(get_data_pointer.c): #include "mex.h" void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) { plhs[0] = mxCreateNumericMatrix(1, 1, mxUINT64_CLASS, mxREAL); *(uint64_t*)mxGetData(plhs[0]) = (uint64_t)mxGetData(prhs[0]); } 我们可以创建MEX文件并将其加载到内存中 mex get_data_pointer.c get_data_pointer(0) 为了清除它, clear mex [~,mexfiles] = inmem version -modules inmem确实返回了一个空单元格数组,指示未在内存中加载任何MEX文件,但是version -modules(未记录,根据此答案)仍显示/Users/cris/matlab/get_data_pointer.mexmaci64在其输出中。更改MEX文件的源代码并重新编译表明,确实从未重新加载MEX文件,旧版本仍在运行,直到有人退出MATLAB。 我在macOS Mojave的MATLAB R2017a上看到了这一点。在High Sierra下使用相同的MATLAB版本从来没有问题。 如何强制MATLAB在不重新启动的情况下卸载MEX文件?

5
如何在不创建导致内存溢出的临时矩阵的情况下“复制”矩阵?
通过将矩阵分配到更大的已分配内存中,matlab将以某种方式在“复制”矩阵时对其进行复制,如果要复制的矩阵足够大,则会发生内存溢出。这是示例代码: main_mat=zeros(500,500,2000); n=500; slice_matrix=zeros(500,500,n); for k=1:4 parfor i=1:n slice_matrix(:,:,i)=gather(gpuArray(rand(500,500))); end main_mat(:,:,1+(k-1)*n:1+(k-1)*n+n-1)=slice_matrix; %This is where the memory will likely overflow end slice_matrix有main_mat没有什么方法可以将其“粉碎” 到没有开销的地方?提前致谢。 编辑: main_mat事先分配时发生溢出。如果main_mat使用main_mat=zeros(500,500,1);(较小的尺寸)初始化,则不会发生溢出,但是由于在分配矩阵之前未进行分配,因此溢出会变慢。随着范围的k增加,这将大大降低性能。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.