ulu 发表于 2008-11-20 22:49

求教元胞cell的奇怪问题

以下程序出错,我觉得很奇怪,有没有谁帮忙解决,谢谢了
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 assignmentA(:) = 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};

ch_j1985 发表于 2008-11-20 23:21

回复 楼主 ulu 的帖子

tmp(1) = Att{1, 1};
tmp(2) = Att{2, 1};
不能这样赋值吧

ChaChing 发表于 2008-11-21 08:34

tmp = Att(:, 1)

ulu 发表于 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字符串数组,不知道我的看法对不对,请高手赐教。

ChaChing 发表于 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 编辑 ]

ChaChing 发表于 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 编辑 ]

ChaChing 发表于 2008-11-21 21:44

本论坛高手如云, 或许楼主搜搜就可找到许多资料!
以下简单说说个人理解, 希望不会重覆!

1.Cell输入产生方式,
a) Cell indexing: clc; a(1,2) ={ 'Anne Smith'}; a(2,1)={};; celldisp(a)
b) Content indexing: clc; a{1,2} = 'Anne Smith'; a{2,1} = ; celldisp(a)
c) 混用: clc; a(1,2) ={ 'Anne Smith'}; a{2,1} = ; cellplot(a)
d) a={[], 'Anne Smith'; , []}; cellplot(a)
e) a=[{[]},{ 'Anne Smith'}; { }, {[]}]; 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 编辑 ]

ulu 发表于 2008-11-22 10:27

再次感谢ChaChing的热心解答:victory:

ydlcsu 发表于 2008-11-24 10:54

原帖由 ChaChing 于 2008-11-21 21:19 发表 http://www.chinavib.com/forum/images/common/back.gif
所以tmp(2) = Att{2, 1};有两个严重错误?
1. tmp(2), Index exceeds matrix dimensions, index根本不存在    %matlab可以自动扩充,这个应该不会有问题
2. Att{2, 1}为2*1的char array, 等号两边元素不相同                %这个才是lz出现错误的根本原因。如果要处理长度不一致的多个字符串,
                                                                                             %cell 是一个很好的选择

ChaChing 发表于 2008-11-24 11:53

原帖由 ydlcsu 于 2008-11-24 10:54 发表 http://www.chinavib.com/forum/images/common/back.gif
...matlab可以自动扩充,这个应该不会有问题...
you are right ! Thks!

ulu 发表于 2008-11-25 17:00

元胞是处理长度不一致的多个字符串的方法,但我觉得元胞使用起来不太方便,例如,不能用Att{:, 1}这类的表达。许多函数也不支持用元胞作为参数,例如,find就好像不能操作元胞。
另外,我也是刚刚学习元胞,想请教各位,如果要在一个元胞中找到一个字符串,有没有简单的方法,例如find。

ydlcsu 发表于 2008-11-26 14:56

1。通过循环来实现
2。利用char命令把cell格式的字符串转成character array形式。再来进行查找(比如用strmatch)。不过有时候要留意自动填入的空格影响
原帖由 ulu 于 2008-11-25 17:00 发表 http://www.chinavib.com/forum/images/common/back.gif
元胞是处理长度不一致的多个字符串的方法,但我觉得元胞使用起来不太方便,例如,不能用Att{:, 1}这类的表达。许多函数也不支持用元胞作为参数,例如,find就好像不能操作元胞。
另外,我也是刚刚学习元胞,想请教各 ...

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

ulu 发表于 2008-11-26 17:33

原帖由 ydlcsu 于 2008-11-26 14:56 发表 http://www.chinavib.com/forum/images/common/back.gif
1。通过循环来实现
2。利用char命令把cell格式的字符串转成character array形式。再来进行查找(比如用strmatch)。不过有时候要留意自动填入的空格影响

嗯,编了一个子函数,用循环解决了,感谢各位的回帖
页: [1]
查看完整版本: 求教元胞cell的奇怪问题