Cell矩阵转换为Mat的问题
各位大大,小弟碰到了这样一个问题,有一个m x n的cell矩阵其中每一个单元又单独放入了一个1x1的cell,在这个1x1的cell中有一个字符型的数字。
例:
cell=
...
...
.....
.....
...
每一个cell中有一个字符型的数字,比如:'12345'
因此实际上只有m x n个数据
我的方法如下:
tempData2 = tempOutCell{1,3};%tempData2就是m x n的cell矩阵
= size(tempData2);
tempData = ones(row,col)*nan;
for numRow=1:row
for numCol=1:col
if isempty(str2num(tempData2{numRow,numCol}))%tempData中不能放入空的数据
continue;
else
tempData(numRow,numCol)=str2num(tempData2{numRow,numCol});
end
end
end
tempOutCell2{1,3}=tempData;
循环嵌套太多,太慢了!!:@Q
请问有没有优化方法,或者更加方便的方式。
PS:使用cell2mat后,由于数据是字符型的,一列数据就变成一个很长的字符串了
回复 楼主 lamsychen 的帖子
楼主可否先贴个mat文件上来方便大家调试?回复 楼主 lamsychen 的帖子
aa={{'11'},{'12'};{'21'},{'22'};{'31'},{'32'}}; =size(aa);aa=reshape(str2num(char(cell2mat(aa))),n,m) 原帖由 ChaChing 于 2009-1-17 23:05 发表 http://www.chinavib.com/forum/images/common/back.gif
aa={{'11'},{'12'};{'21'},{'22'};{'31'},{'32'}}; =size(aa);
aa=reshape(str2num(char(cell2mat(aa))),n,m)
这段代码我运行出错。。。不知ChaChing兄是否调试成功过
??? Error using ==> cell2mat at 55
Cannot support cell arrays containing cell arrays or objects.
另:应sogooda兄要求,截取了一部分数据出来方便大家调试
回复 地板 lamsychen 的帖子
aa={'11','12';'21','22';'31','32'}; =size(aa);aa=str2num(cell2mat(aa))
修改了一下,看看对不对?
回复 地板 lamsychen 的帖子
个人习惯试过才贴! 刚又试过, 没报错!我的版本v6.5, 不会又有差吧!
你的testMat.mat我怎load不进matlab
[ 本帖最后由 ChaChing 于 2009-1-18 00:06 编辑 ] 感谢ChaChing兄的热心帮助
前面我也load过了,成功。。
我的版本是7.5,不知是不是这个问题:@(
另:aa={{'11'},{'12'};{'21'},{'22'};{'31'},{'32'}}; 我发现主要问题是cell2mat报错
唠嗑兄的代码我调试通过了,谢过。
不过不能解决我的问题,两个字段合并在一起了。呵呵:@D
回复 7楼 lamsychen 的帖子
应该是版本问题,在Matlab R2008a上运行也报错 报歉应该是我的版本旧的, 昨晚试时, 就感觉有些地方怪怪的!!唠嗑的str2num(cell2mat(aa))在回覆前即已试过, 版本v6.5是会报错!
所以我才多使用char函数, 且发现使用char後会自动reshape, 所以我又省略reshape函数!
反正个人直觉something wrong, 或许如此(有矛盾??), 新版就修订了! 其实我想法很直觉, 会字段合并是因字符矩阵, 就先reshape成1D, 完成转换後再reshape回即可!
1.首先直觉试下式, 但会报错! 或许新版不会了! 建议LZ试试这个
aa=reshape(str2num(reshape(cell2mat(aa),n*m,1)),n,m)
2.後修正为下式, 没报错!
aa=reshape(str2num(char(reshape(cell2mat(aa),n*m,1))),n,m)
3.发现使用char後会自动reshape, 换成3F的
aa=reshape(str2num(char(cell2mat(aa))),n,m)
[ 本帖最后由 ChaChing 于 2009-1-18 10:45 编辑 ]
回复 10楼 ChaChing 的帖子
我的问题是在cell2mat上报错??? Error using ==> cat
CAT arguments dimensions are not consistent.
Error in ==> cell2mat at 89
m{n} = cat(1,c{:,n});
cat命令只能对每个单元长度相同的cell进行转换
因为我的cell矩阵中字符串的长度不一样因此报错了 试试
aa={{'111'},{'21222'};{'3212'},{'422'};{'531333'},{'632'}}; =size(aa);
aa=reshape(str2num(char(reshape(cell2mat(aa),n*m,1))),n,m)
或
aa={{'111'},{'21222'};{'3212'},{'422'};{'531333'},{'632'}}; =size(aa);
aa=reshape(str2num(reshape(cell2mat(aa),n*m,1)),n,m)
[ 本帖最后由 ChaChing 于 2009-1-18 18:50 编辑 ]
回复 12楼 ChaChing 的帖子
谢谢!以下是cell2mat代码中的一段话
% Error out if cell array contains any cell arrays or objects
ciscell = iscell(c{1});
cisobj = isobject(c{1});
if cisobj || ciscell
error('MATLAB:cell2mat:UnsupportedCellContent',['Cannot support cell ' ...
'arrays containing cell arrays or objects.']);
....
cell中包含cell就不能用cell2mat了
直接用下面这个方式
aa={'111','21222';'3212','422';'531333','632'};
cell2mat也不行,可能我这个问题只能用循环来解决吧
很感谢ChaChing兄的热心回答!
回复 13楼 lamsychen 的帖子
奇怪! 第一次遇到旧版可跑, 新版却报错!office有v7.0明天有空再试试! 谢谢!
回复 14楼 ChaChing 的帖子
好像的确是这样,新版的cell2mat处理aa={'111','21222';'3212','422';'531333','632'}或者aa={{'111'},{'21222'};{'3212'},{'422'};{'531333'},{'632'}}; 都报了错误,写循环读又太麻烦了
页:
[1]
2