qqwq 发表于 2007-4-21 18:21

一个关于Matlab的问题

最近在用Matlab编程,在用for循环给变量命名的时候遇到一个问题,比如程序代码
for i=1:3
   filename_i=.....
end

本想利用for循环,让变量filename_i 随着i 的增加自己跟着变化,可是matlab把filename_i 认做是具体的变量,i 并不变化.有没有朋友遇到类似的问题,是如何解决的?
多谢

熊猫羊 发表于 2007-4-21 18:36

请具体点
直觉
i不是filename_i,不会自增,
最好也别用i,可能于虚数单位混淆

leiwang81 发表于 2007-4-21 19:07

filename_i是一个变量,而不是表示filename_1, filename_2等一系列变量。
你可以这样做先初始化一个变量数组,filename,例如:
filename(1) = 'abc.txt';
filename(2) = 'cde.txt';
然后你就可以用i来调用了
for i = 1:...
    filename(i) = ....; % 或者
    ... = filename(i);
end
但是这个方法有个缺点,filename(1)和filename(2)所对应的字符串必须一样长。如果想避免这个问题,可以把filename变量定义成cell类型,例如
filename{1} = 'abcde.txt';
filename{2} = 'abc.txt';
在使用的时候,要把对应的小括号,变成大括号,如下,
for i = 1:...
    filename{i} = ...; % 或者
    ... = filename{i};
end

rf57 发表于 2007-4-22 00:26

楼上的...你的程序我有几个问题...
1---------
真的可以用 filename(1) = 'abc.txt' 初始数组吗?
............................................................
可以写filename_mat = ['xxx'; 'yyy'; 'zzz'];
filename_cell = cellstr(filename_mat);
之后filename_cell{1}= 'xxx'了...

2---------
z.B.
filename(1) = 'abc.txt';
循环中i=1时
filename(i) = ....;
会改变filename(1)的内容的...

rf57 发表于 2007-4-22 00:44

俺也写个Variante吧...
不知道楼主想给filename_i 赋一个值, (1)
或者filename_i是一个要存的文件的名字. (2)

是(1)的话, 我想并不非要存成filename_i 的形式, filename(i)似乎也可, 只需循环前定义一个数组既可, 等于把值存在一个数组里, 不用我多说的...
(2)的话,
i_str = num2str(i);
filename = ['filename' i_str]; % 或者['filename_' i_str '.txt'], ['filename_' i_str '.mat']等等
save(filename, 'xxx');%xxx是要save的那个变量名

不知道能不能帮上楼主的忙...

jjyy 发表于 2007-4-22 09:16

最简单的方法
for i = 1:10
filename(i) = ['filename_', num2str(i)];
end

rf57 发表于 2007-4-22 11:04

楼上的, 咱俩的程序是一样的...
问题是...filenam(i)不可能再作为变量, 接受赋值了...

leiwang81 发表于 2007-4-22 11:33

原帖由 rf57 于 2007-4-22 12:04 发表 http://www.dolc.de/forum/images/common/back.gif
楼上的, 咱俩的程序是一样的...
问题是...filenam(i)不可能再作为变量, 接受赋值了...

ls说的是,我刚才试了试,确实有这个问题,不过我说的第二个cell的方案没有问题的。谢谢ls提醒。

rf57 发表于 2007-4-22 11:41

原帖由 leiwang81 于 2007-4-22 12:33 发表 http://www.dolc.de/forum/images/common/back.gif


ls说的是,我刚才试了试,确实有这个问题,不过我说的第二个cell的方案没有问题的。谢谢ls提醒。

lsd, 俺还是没理解你的第二个方案, cell的那个, 赋值的时候没有问题吗?

qqwq 发表于 2007-4-22 13:55

多谢大家帮助,问题已经解决,使用cell格式. filename_i 不是要存的文件名,是一个变量.因为程序需要随着for循环把数据存入相应的变量里,而数据是维数不同的矩阵,矩阵又包含了不同的数据类型,所以最后还是用数组解决了这个问题.
我想大家在编程处理大量数据的时候都可能碰到类似的问题, 这个讨论给出了很多提示.多谢.
这里我也给出另一个论坛的相关讨论:


我觉得可以有三种方法
1.用eval根据变量名取变量

[ - ]CODE:
i = 1;
strVarName = sprintf('VarName%d', i);
whatis=functionA(eval(strVarName));   % 此处eval 里的东西只能是变量名字,不能是一个赋值语句
2. 构建一个字符串语句,把要传递的变量赋给一个临时变量存储

[ - ]CODE:
i=1;
eval(sprintf('Temp=VarName%d;', i));% 将 VarName1 放到临时变量 Temp 中
whatis=functionA(Temp);               % 以 Temp 作为参数调用函数
3. 调用函数的语句也构造字符串语句用eval来执行

[ - ]CODE:
i = 1;
strCmd = sprintf('whatis=functionA(VarName%d);', i);
eval(strCmd);
建议:
我以前也用这样的方式构建动态的变量名字,但是后来发现这种方法容易出错,建议用Cell Array来存储。

[ - ]CODE:
for i=1:5
Var{i} = ;
end
whatis=functionA(Var{1});
这样存储数据和调用函数都没有问题,而且非常方便。
页: [1]
查看完整版本: 一个关于Matlab的问题