matlab中num2str函数如何使用?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab中num2str函数如何使用?相关的知识,希望对你有一定的参考价值。
matlab中num2str函数的功能是:把数值转换成字符串, 转换后可以使用fprintf或disp函数进行输出。
在matlab命令窗口中键入doc num2str或help num2str即可获得该函数的帮助信息,从中可以看出num2str的使用方法有三种,以下示例摘自MATLAB中num2str参考页,MATLAB自带有函数的使用说明,函数用法可以直接函数介绍和示例。
1、str = num2str(A)
把数组A中的数转换成字符串表示形式。
例子:
str = num2str(pi)
str =
3.1416
str = num2str(eps)
str =
2.2204e-16
2、str = num2str(A,precision)
把数组A转换成字符串形式表示,precision表示精度, 比如precision为3表示保留最多3位有效数字。
例子:
A = gallery('normaldata',[2,2],0);
precision = 3;
str = num2str(A,precision)
str =
-0.433 0.125
-1.67 0.288
3、str = num2str(A,formatSpec)
按format指定格式进行格式化转换,通常'%11.4g'是默认的。
例子:
A = gallery('uniformdata',[2,3],0) * 9999;
formatSpec = '%10.5e\\n';
str = num2str(A,formatSpec)
str =
9.50034e+03
6.06782e+03
8.91210e+03
2.31115e+03
4.85934e+03
7.62021e+03
扩展资料:
matlab中把字符串转换数值,可以使用str2num函数。语法格式:
1、x = str2num('str')
str是一个ASCII字符串表示的数值, 这种调用格式把字符串转换成数值。str也可以是一个字符串矩阵, 这种情况下, 字符串矩阵被转换成一个数值矩阵。
例子:
>> str2 = '1.0e5';
>> b = str2num(str2)
b =
100000
2、[x, status] = str2num('str')
附加的返回值status用于获取转换状态, status等于逻辑1表示转换成功, 等于0表示转换失败。
例子:
>> str='123';
>> [a, ok] = str2num(str)
a =
123
ok =
1
参考技术A在matlab中num2str的作用是将数字转换为字符数组。
它的语法为:
s = num2str(A)s = num2str(A,precision)s = num2str(A,formatSpec)
其中,
s = num2str(A) 将数值数组转换为表示数字的字符数组。输出格式取决于原始值的量级。
s = num2str(A,precision) 返回表示数字的字符数组,最大有效位数由 precision 指定。
s = num2str(A,formatSpec) 将 formatSpec 指定的格式应用到 A 所有元素。
扩展阅读:
MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。
参考资料: MathWorks中国 - MATLAB官方支持文档 - num2str
参考技术B Matlab函数num2str在matlab中,无论是内建函数还是工具箱函数, 2很常见, 这可能是因为2英文two和to发音相同。而2写起来也比较简单。 所以很多转换类函数都用2来命名而非to。比如number to string, 不是命名为numTostr而num2str。
函数功能: 把数值转换成字符串, 转换后可以使用fprintf或disp函数进行输出。在matlab命令窗口中键入doc num2str或help num2str即可获得该函数的帮助信息。
语法格式:
str = num2str(A)
把数组A中的数转换成字符串表示形式。
str = num2str(A, precision)
把数组A转换成字符串形式表示,precision表示精度, 比如precision为3表示保留最多3位有效数字, 例如 :
0.5345转换后为0.534,1.2345转换后为1.23。即从左边第一个不为0的数开始保留3个数值。
str = num2str(A, format)
按format指定格式进行格式化转换,通常'%11.4g'是默认的。
相关函数: mat2str, int2str, str2num, sprintf, fprintf
应用举例 :
>> A = [1, 2, 3];
>> B = num2str(A);
>> fprintf('%s', B)
1 2 3>>
>> C = [1.564, 0.12345];
>> D = num2str(C, 3)
D =
1.56 0.123
>> D = int32(1)
D =
1
>> num2str(D, '%.6f')
ans =
1.000000
参考技术C 对于你的问题常用其中的两个fminunc和fminsearch ,从结果可以看出fminunc效果好些clcclear%初建目标函数
fun=@(x)3*x(1).^2+2*x(1).*x(2)+x(2).^2;%初值x0=[0.1 0.1];%优化选项options=optimset('largescale','off','display','none','tolfun',1e-20,'tolx',1e-10);
%调用优化函数fminunc
[x,fval]=fminunc(fun,x0,options);
display(['使用fminunc函数,计算得:在x1=' num2str(x(1)) ',x2=' num2str(x(2)) ',取得目标函数最小值' num2str(fval)])
%调用fminsearch
[x,fval]=fminsearch(fun,x0,options);
disp(char(13))
display(['使用fminsearch函数,计算得:在x1=' num2str(x(1)) ',x2=' num2str(x(2)) ',取得目标函数最小值' num2str(fval)])
运行结果为(根据不同的初值,可能得到不同的结果)本回答被提问者采纳
如何在 MATLAB 中编写向量化函数
【中文标题】如何在 MATLAB 中编写向量化函数【英文标题】:How to write vectorized functions in MATLAB 【发布时间】:2011-12-10 11:35:30 【问题描述】:我刚刚学习 MATLAB,我发现很难理解循环与矢量化函数的性能因素。
在我之前的问题中:Nested for loops extremely slow in MATLAB (preallocated) 我意识到使用矢量化函数与 4 个嵌套循环相比,在运行时间上产生了 7 倍的差异。
在该示例中,不是循环遍历 4 维数组的所有维度并计算每个向量的中值,而是调用 median(stack, n) 更简洁、更快,其中 n 表示中值函数的工作维度。
但中位数只是一个非常简单的例子,我很幸运它实现了这个维度参数。
我的问题是,您如何自己编写一个与实现了这个维度范围的函数一样有效的函数?
例如,您有一个函数my_median_1D
,它只适用于一维向量并返回一个数字。
你如何编写一个函数my_median_nD
,它的作用类似于 MATLAB 的中位数,通过一个 n 维数组和一个 “工作维度” 参数?
更新
我找到了计算高维中位数的代码
% In all other cases, use linear indexing to determine exact location
% of medians. Use linear indices to extract medians, then reshape at
% end to appropriate size.
cumSize = cumprod(s);
total = cumSize(end); % Equivalent to NUMEL(x)
numMedians = total / nCompare;
numConseq = cumSize(dim - 1); % Number of consecutive indices
increment = cumSize(dim); % Gap between runs of indices
ixMedians = 1;
y = repmat(x(1),numMedians,1); % Preallocate appropriate type
% Nested FOR loop tracks down medians by their indices.
for seqIndex = 1:increment:total
for consIndex = half*numConseq:(half+1)*numConseq-1
absIndex = seqIndex + consIndex;
y(ixMedians) = x(absIndex);
ixMedians = ixMedians + 1;
end
end
% Average in second value if n is even
if 2*half == nCompare
ixMedians = 1;
for seqIndex = 1:increment:total
for consIndex = (half-1)*numConseq:half*numConseq-1
absIndex = seqIndex + consIndex;
y(ixMedians) = meanof(x(absIndex),y(ixMedians));
ixMedians = ixMedians + 1;
end
end
end
% Check last indices for NaN
ixMedians = 1;
for seqIndex = 1:increment:total
for consIndex = (nCompare-1)*numConseq:nCompare*numConseq-1
absIndex = seqIndex + consIndex;
if isnan(x(absIndex))
y(ixMedians) = NaN;
end
ixMedians = ixMedians + 1;
end
end
您能否向我解释一下与简单的嵌套循环相比,为什么这段代码如此有效?就像其他函数一样,它具有嵌套循环。
我不明白怎么会快 7 倍,还有,为什么这么复杂。
更新 2
我意识到使用中位数并不是一个很好的例子,因为它本身就是一个复杂的函数,需要对数组进行排序或其他巧妙的技巧。我用平均值重新进行了测试,结果更加疯狂: 19 秒对 0.12 秒。 这意味着 sum 的内置方式比嵌套循环快 160 倍。
我真的很难理解一种行业领先的语言如何根据编程风格有如此极端的性能差异,但我看到下面的答案中提到的几点。
【问题讨论】:
在 Matlab 命令提示符下键入“open median”,看看 Mathworks 是如何做到的!然而,他们作弊 - sort(X, dim) 是内置的。 【参考方案1】:更新 2 (解决您更新后的问题)
MATLAB 经过优化,可以很好地处理数组。一旦你习惯了它,实际上只需要键入一行并让 MATLAB 自己完成完整的 4D 循环,而不必担心它,这实际上非常好。 MATLAB 经常用于原型设计/一次性计算,因此节省编码人员的时间并放弃 C[++|#] 的一些灵活性是有意义的。
这就是为什么 MATLAB 在内部一些 循环非常好 - 通常是将它们编码为编译函数。
您提供的代码 sn-p 并不真正包含执行主要工作的相关代码行,即
% Sort along given dimension
x = sort(x,dim);
换句话说,您显示的代码只需要通过它们在现在排序的多维数组x
中的正确索引来访问中值(这不会花费太多时间)。访问所有数组元素的实际工作由sort
完成,这是一个内置(即编译和高度优化的)函数。
原始答案 (关于如何构建自己的处理数组的快速函数)
实际上有相当多的内置函数采用维度参数:min(stack, [], n)
、max(stack, [], n)
、mean(stack, n)
、std(stack, [], n)
、median(stack,n)
、sum(stack, n)
... exp()
、sin()
等内置函数会自动作用于整个数组的每个元素(即,如果 stack
是 4D,sin(stack)
会自动为您执行四个嵌套循环),您可以构建很多您可能只需要依赖现有的内置函数。
如果这对于特定情况还不够,您应该查看repmat
、bsxfun
、arrayfun
和accumarray
,它们是非常强大的“MATLAB 方式”处理函数。只需在 SO 上搜索问题(或更确切地说是答案)usingoneofthese,我通过这种方式学到了很多关于 MATLAB 的优势。
作为一个示例,假设您想沿维度n
实现堆栈的p-norm,您可以编写
function result=pnorm(stack, p, n)
result=sum(stack.^p,n)^(1/p);
...您可以有效地重用sum
的“which-dimension-capability”。
更新
正如 Max 在 cmets 中指出的那样,还可以查看 colon operator (:
),它是一个非常强大的工具,可以从数组中选择元素(或者甚至改变它的形状,通常使用 reshape
来完成)。
一般来说,请查看帮助中的 Array Operations 部分 - 它包含 repmat
等。上面提到过,还有cumsum
和一些更晦涩的辅助函数,您应该将它们用作构建块。
【讨论】:
还要看看矩阵整形,以及 : 运算符的许多用途。 我用 'mean' 而不是 'median' 做了另一个测试来使用没有排序的函数,结果更加疯狂。这样,内置函数实际上快了 160 倍。这是 0.12 秒对 19 秒!感谢您的回答和更新!【参考方案2】:矢量化
除了已经说过的之外,您还应该了解vectorization 涉及并行化,即对数据执行并发操作而不是顺序执行(想想 SIMD 指令),甚至在某些情况下利用线程和多处理器...
MEX 文件
现在虽然“解释与编译”这一点已经争论过了,但没有人提到您可以通过编写 MEX 文件来扩展 MATLAB,这些文件是用 C 编写的编译可执行文件,可以从内部作为普通函数直接调用MATLAB。这允许您使用 C 等较低级别的语言来实现性能关键部分。
列主要顺序
最后,在尝试优化某些代码时,请始终记住 MATLAB 以列优先顺序存储矩阵。与其他任意顺序相比,按该顺序访问元素可以产生显着的改进。
例如,在您之前的链接问题中,您正在计算沿某个维度的堆叠图像集的 median
。现在,这些维度的排序顺序极大地影响了性能。插图:
%# sequence of 10 images
fPath = fullfile(matlabroot,'toolbox','images','imdemos');
files = dir( fullfile(fPath,'AT3_1m4_*.tif') );
files = strcat(fPath,filesep,files.name'); %'
I = imread( files1 );
%# stacked images along the 1st dimension: [numImages H W RGB]
stack1 = zeros([numel(files) size(I) 3], class(I));
for i=1:numel(files)
I = imread( filesi );
stack1(i,:,:,:) = repmat(I, [1 1 3]); %# grayscale to RGB
end
%# stacked images along the 4th dimension: [H W RGB numImages]
stack4 = permute(stack1, [2 3 4 1]);
%# compute median image from each of these two stacks
tic, m1 = squeeze( median(stack1,1) ); toc
tic, m4 = median(stack4,4); toc
isequal(m1,m4)
时间差很大:
Elapsed time is 0.257551 seconds. %# stack1
Elapsed time is 17.405075 seconds. %# stack4
【讨论】:
【参考方案3】:您能否向我解释一下为什么这段代码与简单的嵌套循环相比如此有效?它和其他函数一样有嵌套循环。
嵌套循环的问题不在于嵌套循环本身。这是您在内部执行的操作。
每个函数调用(尤其是对非内置函数的调用)都会产生一点点开销;如果函数执行例如,更是如此无论输入大小如何,错误检查都需要相同的时间。因此,如果一个函数只有 1 毫秒的开销,如果你调用它 1000 次,你将浪费一秒钟。如果您可以调用它一次来执行矢量化计算,那么您只需支付一次开销。
此外,JIT compiler (pdf) 可以帮助矢量化 simple for 循环,例如,您只执行基本的算术运算。因此,在您的帖子中进行简单计算的循环会加快很多,而调用 median
的循环则不会。
【讨论】:
【参考方案4】:在这种情况下
M = median(A,dim) returns the median values for elements along the dimension of A specified by scalar dim
但是使用通用函数,您可以尝试使用 mat2cell
拆分数组(它可以处理 n-D 数组,而不仅仅是矩阵)并通过 cellfun
应用您的 my_median_1D
函数。下面我将使用median
为例来说明你得到了相同的结果,但是你可以将它传递给m 文件中定义的任何函数,或者使用@(args)
符号定义的匿名函数。
>> testarr = [[1 2 3]' [4 5 6]']
testarr =
1 4
2 5
3 6
>> median(testarr,2)
ans =
2.5000
3.5000
4.5000
>> shape = size(testarr)
shape =
3 2
>> cellfun(@median,mat2cell(testarr,repmat(1,1,shape(1)),[shape(2)]))
ans =
2.5000
3.5000
4.5000
【讨论】:
(注意mat2cell
调用的输出是一个行向量元胞数组。)以上是关于matlab中num2str函数如何使用?的主要内容,如果未能解决你的问题,请参考以下文章
matlab中的“disp函数”和“num2str()函数”如何使用?