声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 8673|回复: 17

[编程技巧] Cell矩阵转换为Mat的问题

[复制链接]
发表于 2009-1-17 18:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
各位大大,小弟碰到了这样一个问题,有一个m x n的cell矩阵
其中每一个单元又单独放入了一个1x1的cell,在这个1x1的cell中有一个字符型的数字。

例:
cell=
  [1x1cell]  [1x1cell]  [1x1cell]  [1x1cell]...
  [1x1cell]  [1x1cell]  [1x1cell]  [1x1cell]...
  .....
  .....
[1x1cell]  [1x1cell]  [1x1cell]  [1x1cell]...

每一个cell中有一个字符型的数字,比如:'12345'
因此实际上只有m x n个数据

我的方法如下:
    tempData2 = tempOutCell{1,3};  %tempData2就是m x n的cell矩阵
    [row,col] = 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后,由于数据是字符型的,一列数据就变成一个很长的字符串了
回复
分享到:

使用道具 举报

发表于 2009-1-17 22:13 | 显示全部楼层

回复 楼主 lamsychen 的帖子

楼主可否先贴个mat文件上来方便大家调试?
发表于 2009-1-17 23:05 | 显示全部楼层

回复 楼主 lamsychen 的帖子

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

评分

1

查看全部评分

 楼主| 发表于 2009-1-17 23:38 | 显示全部楼层


这段代码我运行出错。。。不知ChaChing兄是否调试成功过
??? Error using ==> cell2mat at 55
Cannot support cell arrays containing cell arrays or objects.

另:应sogooda兄要求,截取了一部分数据出来方便大家调试

testMat.mat

1.83 KB, 下载次数: 5

发表于 2009-1-17 23:56 | 显示全部楼层

回复 地板 lamsychen 的帖子

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

评分

1

查看全部评分

发表于 2009-1-18 00:02 | 显示全部楼层

回复 地板 lamsychen 的帖子

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

你的testMat.mat我怎load不进matlab

[ 本帖最后由 ChaChing 于 2009-1-18 00:06 编辑 ]
 楼主| 发表于 2009-1-18 00:56 | 显示全部楼层
感谢ChaChing兄的热心帮助

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

唠嗑兄的代码我调试通过了,谢过。
不过不能解决我的问题,两个字段合并在一起了。呵呵:@D
发表于 2009-1-18 01:19 | 显示全部楼层

回复 7楼 lamsychen 的帖子

应该是版本问题,在Matlab R2008a上运行也报错
发表于 2009-1-18 10:34 | 显示全部楼层
报歉应该是我的版本旧的, 昨晚试时, 就感觉有些地方怪怪的!!
唠嗑的str2num(cell2mat(aa))在回覆前即已试过, 版本v6.5是会报错!
所以我才多使用char函数, 且发现使用char後会自动reshape, 所以我又省略reshape函数!
反正个人直觉something wrong, 或许如此(有矛盾??), 新版就修订了!
发表于 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 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 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矩阵中字符串的长度不一样因此报错了
发表于 2009-1-18 18:44 | 显示全部楼层
试试
aa={{'111'},{'21222'};{'3212'},{'422'};{'531333'},{'632'}}; [n,m]=size(aa);
aa=reshape(str2num(char(reshape(cell2mat(aa),n*m,1))),n,m)

aa={{'111'},{'21222'};{'3212'},{'422'};{'531333'},{'632'}}; [n,m]=size(aa);
aa=reshape(str2num(reshape(cell2mat(aa),n*m,1)),n,m)

[ 本帖最后由 ChaChing 于 2009-1-18 18:50 编辑 ]
 楼主| 发表于 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兄的热心回答!

评分

1

查看全部评分

发表于 2009-1-18 22:42 | 显示全部楼层

回复 13楼 lamsychen 的帖子

奇怪! 第一次遇到旧版可跑, 新版却报错!
office有v7.0明天有空再试试! 谢谢!
发表于 2009-1-19 08:58 | 显示全部楼层

回复 14楼 ChaChing 的帖子

好像的确是这样,新版的cell2mat处理aa={'111','21222';'3212','422';'531333','632'}或者aa={{'111'},{'21222'};{'3212'},{'422'};{'531333'},{'632'}}; 都报了错误,写循环读又太麻烦了
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-9-22 21:30 , Processed in 0.067975 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表