声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1869|回复: 12

[编程技巧] 求教元胞cell的奇怪问题

[复制链接]
发表于 2008-11-20 22:49 | 显示全部楼层 |阅读模式

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

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

x
以下程序出错,我觉得很奇怪,有没有谁帮忙解决,谢谢了
Att = cell(2, 2);
Att{1,1} = '1';
Att{2,1} = '10';
Att{1,2} = 19;
Att{2,2} = 20;
tmp(1) = Att{1, 1};
tmp(2) = Att{2, 1};
错误信息:
??? In an assignment  A(:) = B, the number of elements in A and B
must be the same.

Error in ==> C:\MATLAB6p5\work\GenSecfminconmain.m
On line 10  ==> tmp(2) = Att{2, 1};
回复
分享到:

使用道具 举报

发表于 2008-11-20 23:21 | 显示全部楼层

回复 楼主 ulu 的帖子

tmp(1) = Att{1, 1};
tmp(2) = Att{2, 1};
不能这样赋值吧
发表于 2008-11-21 08:34 | 显示全部楼层
tmp = Att(:, 1)

评分

1

查看全部评分

 楼主| 发表于 2008-11-21 14:41 | 显示全部楼层
谢谢ChaChing,我发现这个问题其实不是cell的问题,而是matlab字符串数组的规定与VC、Delphi不太一样。举几个例子
1、
Att = ['11'
    '10'];
tmp(1) = Att(1);
tmp(2) = Att(2);
tmp(3) = Att(3);
tmp(4) = Att(4);


2、
Att = ['1'
    '10'];
tmp(1) = Att(1);
tmp(2) = Att(2);
tmp(3) = Att(3);


3、
Att = str2mat('11','10');
tmp(1) = Att(1);
tmp(2) = Att(2);
tmp(3) = Att(3);
tmp(4) = Att(4);


4、
Att = str2mat('1','10');
tmp(1) = Att(1);
tmp(2) = Att(2);
tmp(3) = Att(3);
tmp(4) = Att(4);


5、
Att = ['11'
    '10'];
tmp(1) = Att(1,:);
tmp(2) = Att(2,:);

6、
Att = ['11'
    '10'];
tmp1 = Att(1,:);
tmp2  = Att(2,:);

还可以有其他变化,结果有些意思。
感觉matlab字符串数组比较麻烦,是不是多行matlab字符串数组需要每行的长度一样?即使str2mat看起来可以处理不同长度的字符串,但其实它也是用空('')处理让它们都一样。如果我想要一个多行多列的字符串矩阵,是不是只能用元胞来处理呢?
刚接触matlab字符串数组,不知道我的看法对不对,请高手赐教。

评分

1

查看全部评分

发表于 2008-11-21 21:19 | 显示全部楼层

回复 楼主 ulu 的帖子

其实是可以tmp(1) = Att{1, 1}; 这样赋值的! 那麽楼主错在那里?
Att = cell(2, 2); Att{1,1} = '1'; Att{2,1} = '10'; Att{1,2} = 19; Att{2,2} = 20; tmp(1) = Att{1, 1}; whos; tmp(2) = Att{2, 1};
tmp(1) = Att{1, 1};後tmp为1*1的char array, 所以tmp(2) = Att{2, 1};有两个严重错误?
1. tmp(2), Index exceeds matrix dimensions, index根本不存在
2. Att{2, 1}为2*1的char array, 等号两边元素不相同
逐行试试以下指令
clear *; aa='z'; aa(2)
clear *; aa='abc'; aa(2)
clear *; aa='abc'; aa(2)='dd'
clear *; aa='abc'; aa(2:3)='de'

[ 本帖最后由 ChaChing 于 2008-11-21 21:23 编辑 ]
发表于 2008-11-21 21:38 | 显示全部楼层

回复 地板 ulu 的帖子

你举的例子都与cell无关, 单纯是char array问题!

1. Att为2*2 char array, 与一维有相对关系, 试试
  Att = ['ab';'cd']; tmp(1:4) = Att(:);
2. Att = ['1';'10']; 错误! 个数不match!
3. 其实同1, 试试Att = str2mat('ab','cd');
4. Att = str2mat('1','10'); 会补空格, 试试Att = str2mat('a','cd');
5.tmp(1) = Att(1,:); 错误!  左侧仅一个char而右侧有2个char
6. OK!

[ 本帖最后由 ChaChing 于 2008-11-21 21:40 编辑 ]
发表于 2008-11-21 21:44 | 显示全部楼层
本论坛高手如云, 或许楼主搜搜就可找到许多资料!
以下简单说说个人理解, 希望不会重覆!

1.Cell输入产生方式,
  a) Cell indexing: clc; a(1,2) ={ 'Anne Smith'}; a(2,1)={[1 4;2 9]};; celldisp(a)
  b) Content indexing: clc; a{1,2} = 'Anne Smith'; a{2,1} = [1 4;2 9]; celldisp(a)
  c) 混用: clc; a(1,2) ={ 'Anne Smith'}; a{2,1} = [1 4;2 9]; cellplot(a)
  d) a={[], 'Anne Smith'; [1 4;2 9], []}; cellplot(a)
  e) a=[{[]},{ 'Anne Smith'}; {[1 4;2 9] }, {[]}]; cellplot(a)
2.
  a) 多组信号名称产生可用a={'Vertical', 'logitudinal', 'lateral'} or a={'Vertical'; 'logitudinal'; 'lateral'}
      第2个信号名称可用a(2)容易取得
  b) 但文字距矩阵a=['Vertical', 'logitudinal', 'lateral']混乱了,
      a=['   Vertical'; 'logitudinal'; '    lateral'], 第2个可用a(2,:)容易取得;
3.函数的输出入varargout/varargin使用, 使得函数使用更可一般化, 通用化

[ 本帖最后由 ChaChing 于 2008-11-22 08:58 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2008-11-22 10:27 | 显示全部楼层
再次感谢ChaChing的热心解答:victory:
发表于 2008-11-24 10:54 | 显示全部楼层
[quote]原帖由 ChaChing 于 2008-11-21 21:19 发表
所以tmp(2) = Att{2, 1};有两个严重错误?
1. tmp(2), Index exceeds matrix dimensions, index根本不存在    %matlab可以自动扩充,这个应该不会有问题
2. Att{2, 1}为2*1的char array, 等号两边元素不相同                %这个才是lz出现错误的根本原因。如果要处理长度不一致的多个字符串
                                                                                             %cell 是一个很好的选择

评分

1

查看全部评分

发表于 2008-11-24 11:53 | 显示全部楼层
原帖由 ydlcsu 于 2008-11-24 10:54 发表
...matlab可以自动扩充,这个应该不会有问题...

you are right ! Thks!
 楼主| 发表于 2008-11-25 17:00 | 显示全部楼层
元胞是处理长度不一致的多个字符串的方法,但我觉得元胞使用起来不太方便,例如,不能用Att{:, 1}这类的表达。许多函数也不支持用元胞作为参数,例如,find就好像不能操作元胞。
另外,我也是刚刚学习元胞,想请教各位,如果要在一个元胞中找到一个字符串,有没有简单的方法,例如find。
发表于 2008-11-26 14:56 | 显示全部楼层
1。通过循环来实现
2。利用char命令把cell格式的字符串转成character array形式。再来进行查找(比如用strmatch)。不过有时候要留意自动填入的空格影响
原帖由 ulu 于 2008-11-25 17:00 发表
元胞是处理长度不一致的多个字符串的方法,但我觉得元胞使用起来不太方便,例如,不能用Att{:, 1}这类的表达。许多函数也不支持用元胞作为参数,例如,find就好像不能操作元胞。
另外,我也是刚刚学习元胞,想请教各 ...

[ 本帖最后由 ydlcsu 于 2008-11-26 15:55 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2008-11-26 17:33 | 显示全部楼层
原帖由 ydlcsu 于 2008-11-26 14:56 发表
1。通过循环来实现
2。利用char命令把cell格式的字符串转成character array形式。再来进行查找(比如用strmatch)。不过有时候要留意自动填入的空格影响

嗯,编了一个子函数,用循环解决了,感谢各位的回帖
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-5-20 16:49 , Processed in 0.102258 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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