lamsychen 发表于 2009-1-17 18:41

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后,由于数据是字符型的,一列数据就变成一个很长的字符串了

sogooda 发表于 2009-1-17 22:13

回复 楼主 lamsychen 的帖子

楼主可否先贴个mat文件上来方便大家调试?

ChaChing 发表于 2009-1-17 23:05

回复 楼主 lamsychen 的帖子

aa={{'11'},{'12'};{'21'},{'22'};{'31'},{'32'}}; =size(aa);
aa=reshape(str2num(char(cell2mat(aa))),n,m)

lamsychen 发表于 2009-1-17 23:38

原帖由 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兄要求,截取了一部分数据出来方便大家调试

ch_j1985 发表于 2009-1-17 23:56

回复 地板 lamsychen 的帖子

aa={'11','12';'21','22';'31','32'}; =size(aa);
aa=str2num(cell2mat(aa))
修改了一下,看看对不对?

ChaChing 发表于 2009-1-18 00:02

回复 地板 lamsychen 的帖子

个人习惯试过才贴! 刚又试过, 没报错!
我的版本v6.5, 不会又有差吧!

你的testMat.mat我怎load不进matlab

[ 本帖最后由 ChaChing 于 2009-1-18 00:06 编辑 ]

lamsychen 发表于 2009-1-18 00:56

感谢ChaChing兄的热心帮助

前面我也load过了,成功。。
我的版本是7.5,不知是不是这个问题:@(
另:aa={{'11'},{'12'};{'21'},{'22'};{'31'},{'32'}}; 我发现主要问题是cell2mat报错

唠嗑兄的代码我调试通过了,谢过。
不过不能解决我的问题,两个字段合并在一起了。呵呵:@D

ch_j1985 发表于 2009-1-18 01:19

回复 7楼 lamsychen 的帖子

应该是版本问题,在Matlab R2008a上运行也报错

ChaChing 发表于 2009-1-18 10:34

报歉应该是我的版本旧的, 昨晚试时, 就感觉有些地方怪怪的!!
唠嗑的str2num(cell2mat(aa))在回覆前即已试过, 版本v6.5是会报错!
所以我才多使用char函数, 且发现使用char後会自动reshape, 所以我又省略reshape函数!
反正个人直觉something wrong, 或许如此(有矛盾??), 新版就修订了!

ChaChing 发表于 2009-1-18 10:43

其实我想法很直觉, 会字段合并是因字符矩阵, 就先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 编辑 ]

lamsychen 发表于 2009-1-18 17:40

回复 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矩阵中字符串的长度不一样因此报错了

ChaChing 发表于 2009-1-18 18:44

试试
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 编辑 ]

lamsychen 发表于 2009-1-18 19:40

回复 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兄的热心回答!

ChaChing 发表于 2009-1-18 22:42

回复 13楼 lamsychen 的帖子

奇怪! 第一次遇到旧版可跑, 新版却报错!
office有v7.0明天有空再试试! 谢谢!

guchang9357 发表于 2009-1-19 08:58

回复 14楼 ChaChing 的帖子

好像的确是这样,新版的cell2mat处理aa={'111','21222';'3212','422';'531333','632'}或者aa={{'111'},{'21222'};{'3212'},{'422'};{'531333'},{'632'}}; 都报了错误,写循环读又太麻烦了
页: [1] 2
查看完整版本: Cell矩阵转换为Mat的问题