萍聚社区-德国热线-德国实用信息网

 找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

查看: 783|回复: 9

[计算机] 一个关于Matlab的问题

[复制链接]
发表于 2007-4-21 18:21 | 显示全部楼层 |阅读模式

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

您需要 登录 才可以下载或查看,没有账号?注册 微信登录

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

本想利用for循环,让变量filename_i 随着i 的增加自己跟着变化,可是matlab把filename_i 认做是具体的变量,i 并不变化.有没有朋友遇到类似的问题,是如何解决的?
多谢
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-4-21 18:36 | 显示全部楼层
请具体点
直觉
i不是filename_i,不会自增,
最好也别用i,可能于虚数单位混淆
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 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

评分

1

查看全部评分

Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 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)的内容的...

评分

1

查看全部评分

Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 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的那个变量名

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

评分

1

查看全部评分

Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-4-22 09:16 | 显示全部楼层
最简单的方法
for i = 1:10
  filename(i) = ['filename_', num2str(i)];
end
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-4-22 11:04 | 显示全部楼层
楼上的, 咱俩的程序是一样的...
问题是...filenam(i)不可能再作为变量, 接受赋值了...
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-4-22 11:33 | 显示全部楼层
原帖由 rf57 于 2007-4-22 12:04 发表
楼上的, 咱俩的程序是一样的...
问题是...filenam(i)不可能再作为变量, 接受赋值了...


ls说的是,我刚才试了试,确实有这个问题,不过我说的第二个cell的方案没有问题的。谢谢ls提醒。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-4-22 11:41 | 显示全部楼层
原帖由 leiwang81 于 2007-4-22 12:33 发表


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


lsd, 俺还是没理解你的第二个方案, cell的那个, 赋值的时候没有问题吗?
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2007-4-22 13:55 | 显示全部楼层
多谢大家帮助,问题已经解决,使用cell格式. filename_i 不是要存的文件名,是一个变量.因为程序需要随着for循环把数据存入相应的变量里,而数据是维数不同的矩阵,矩阵又包含了不同的数据类型,所以最后还是用数组解决了这个问题.
我想大家在编程处理大量数据的时候都可能碰到类似的问题, 这个讨论给出了很多提示.多谢.
这里我也给出另一个论坛的相关讨论:


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

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

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

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

[Copy to clipboard] [ - ]CODE:
for i=1:5
  Var{i} = [0:1:i];
end
whatis=functionA(Var{1});
这样存储数据和调用函数都没有问题,而且非常方便。

评分

1

查看全部评分

Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

手机版|Archiver|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网

GMT+1, 2025-2-8 15:00 , Processed in 0.075798 second(s), 18 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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