Oct 202012
 
This entry is part 8 of 13 in the series Matlab基础班附加材料

今天在Matlab官方文档的External Interfaces (R2012a版本)中看到一个错误,在11-4页,其实这个问题是一个基础性的问题。

在Matlab中,sprintf()和fprintf()函数不支持cell类型的数据,那么就需要用{:}的形势将cell中的原始数据提取出来,提取出来的时候,是自上而下从左到右,一列一列地提取出来。另一方面,sprintf()函数中的控制语句(%s,%f之类),接受的数据是按照顺序,循环着来,不是一行一行地处理,例如(1,2;3,4)这个矩阵在‘%d,%d’控制之下的输出是"1,32,4"。

 >> a=[1,2;3,4]

a =

1 2
3 4

>> fprintf('%d, %d',a)
1, 32, 4>>

11-4页面底部出现的这个错误就是, 因为没有搞清楚sprintf()中控制语句的输出顺序。要解决这个结果,很简单,只要将这个cell矩阵做个转置,最后输出就行。

>> list=actxcontrollist;
>> tmp=list';
>> s=sprintf(' Name=%s\n ProgID=%s\n File=%s\n',tmp{:,1:3})

s =

Name=ButtonBar Class
ProgID=UmOutlookAddin.ButtonBar.1
File=C:\Program Files\Microsoft Office\Office14\ADDINS\UmOutlookAddin.dll
Name=CTreeView Control
ProgID=CTREEVIEW.CTreeViewCtrl.1
File=C:\Windows\system32\dmocx.dll
Name=CommonDialog Class
ProgID=WIA.CommonDialog.1
File=C:\Windows\System32\wiaaut.dll

上面这个例子的简单之处在于它只有一个cell。如果需要用控制函数将多个向量一次性输出,那么就要要小心了。例如:我们要格式化输出这几天是星期几,单个数据很简单:

>> fprintf('date: %s, weekday: %d\n ',datestr(now,26),weekday(now));
date: 2012/10/20, weekday: 7

如果日期是一个向量呢?

 fprintf('date: %s, weekday: %d\n ',datestr(now:now+3,26),weekday(now:now+3));
date: 2222000011112222////11110000////22220123, weekday: 7
date: , weekday: >>

这样就傻逼了。解决办法是“曲线救国”——先转换成cell,再转置,最后输出:

 >> tmp=[cellstr(datestr(now:now+3,26)), num2cell(weekday(now:now+3)')]

tmp =

'2012/10/20' [7]
'2012/10/21' [1]
'2012/10/22' [2]
'2012/10/23' [3]

>> tmp=tmp'

tmp =

'2012/10/20' '2012/10/21' '2012/10/22' '2012/10/23'
[ 7] [ 1] [ 2] [ 3]

>> fprintf('Date: %s; Weekday: %d \n',tmp{:})
Date: 2012/10/20; Weekday: 7
Date: 2012/10/21; Weekday: 1
Date: 2012/10/22; Weekday: 2
Date: 2012/10/23; Weekday: 3

No related posts.

Series Navigation<< Matlab中的ExLink生成“真正随机”的随机数 >>
Bookmark/FavoritesSina WeiboGoogle+FacebookQQTwitterYahoo BookmarksBaiduDiggEmailGoogle GmailOutlook.comEvernotePrintAIMLinkedInBlogger PostKindle ItShare

Related Posts:
  • No Related Posts, :-(

 Leave a Reply

(required)

(required)


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>