找回密码
 注册
Simdroid-非首页
查看: 226|回复: 8

如何在循环中自动生成变量名,并赋值

[复制链接]
发表于 2007-4-14 08:34:33 | 显示全部楼层 |阅读模式 来自 美国
如何在循环中自动生成变量名,并赋值:

eg:

for i=1:5
                                                           % 定义变量名['VarName',num2str(i)], 每个变量名对应不同的数组
['VarName',num2str(i)]=[0:1:i];           %这么写的错误是??? Error: An array for multiple LHS assignment cannot contain character string.
end

各位有没有办法,谢谢
发表于 2007-4-14 09:16:51 | 显示全部楼层 来自 浙江舟山
Simdroid开发平台
for i = 1 : 5
   strCmd = sprintf('VarName%d=[0:1:i];', i);  % 构建语句代码,存储在字符串变量中
   eval(strCmd);  % 用eval函数执行存储在字符串中的代码
end

评分

1

查看全部评分

 楼主| 发表于 2007-4-14 12:32:50 | 显示全部楼层 来自 美国
多谢金牌会员SCIE
继续问这个问题,关于如何用这个自动生成的名字进行参数传递在function中

比如

hi=2;
strCmd =sprintf('VarName%d=10;', hi)

希望将VarName2=10带入函数计算

whatis=functionA(eval(strCmd)) % 这个操作是错误的,如何正确执行这样的功能?谢谢



function a=functionA(b)
a=b;
发表于 2007-4-14 12:57:10 | 显示全部楼层 来自 广东深圳
可以在函数体内部eval(b),而不是在传递参数的时候eval。

因为eval(b),b不是一个函数或者命令,没有返回值,所以你的函数变量压栈的时候找不到变量,自然会提示错误。

推荐使用SCIE 的给的第四种cell。主要是eval这个函数暂时(我用的是7.0)不能被matlab编译器编译,用mcc就可能出错。

[ 本帖最后由 dingzixiu 于 2007-4-14 19:29 编辑 ]
发表于 2007-4-14 16:38:25 | 显示全部楼层 来自 浙江舟山
我觉得可以有三种方法
1.用eval根据变量名取变量

  1. i = 1;
  2. strVarName = sprintf('VarName%d', i);
  3. whatis=functionA(eval(strVarName));   % 此处eval 里的东西只能是变量名字,不能是一个赋值语句
复制代码


2. 构建一个字符串语句,把要传递的变量赋给一个临时变量存储

  1. i=1;
  2. eval(sprintf('Temp=VarName%d;', i));  % 将 VarName1 放到临时变量 Temp 中
  3. whatis=functionA(Temp);               % 以 Temp 作为参数调用函数
复制代码


3. 调用函数的语句也构造字符串语句用eval来执行

  1. i = 1;
  2. strCmd = sprintf('whatis=functionA(VarName%d);', i);
  3. eval(strCmd);
复制代码


建议:
我以前也用这样的方式构建动态的变量名字,但是后来发现这种方法容易出错,建议用Cell Array来存储。

  1. for i=1:5
  2.   Var{i} = [0:1:i];
  3. end
  4. whatis=functionA(Var{1});
复制代码

这样存储数据和调用函数都没有问题,而且非常方便。

评分

1

查看全部评分

 楼主| 发表于 2007-4-15 01:26:15 | 显示全部楼层 来自 美国
前两种我试过了,有问题,cell array应该不错,多谢2位朋友
发表于 2010-6-3 21:27:54 | 显示全部楼层 来自 陕西西安
我也试过这样的操作,是按照matlab例子中进行的

for n = 1:12
        eval(['M' num2str(n) ' = magic(n)']);
end
但是如何能不让M1、M2……输出到工作空间呢?
回复 不支持

使用道具 举报

发表于 2010-6-3 22:42:22 | 显示全部楼层 来自 北京
我觉得元胞是一个不错的选择
回复 不支持

使用道具 举报

发表于 2010-6-4 09:10:36 | 显示全部楼层 来自 北京

  1. clear;clc;close all
  2. n=26;
  3. data=cellfun(@int2str,num2cell(unidrnd(n,1,n)),'UniformOutput',false);
  4. varAZ=cellfun(@char,num2cell(97:122),'UniformOutput',false);
  5. p=[];
  6. for i=1:length(varAZ)
  7.     if i==1
  8.         pp=sprintf('[%s,',varAZ{i});
  9.     elseif i==length(varAZ)
  10.         pp=sprintf('%s]',varAZ{i});
  11.     else
  12.         pp=sprintf('%s,',varAZ{i});
  13.     end
  14.     p=[p,pp];
  15. end
  16. cf=num2cell(str2double(data));
  17. p2=sprintf('=cf{:}');
  18. p=[p,p2];
  19. eval(p);
复制代码
这是我写的一个自动生成变量的程序,不是在循环中生成的

评分

1

查看全部评分

回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-4 21:28 , Processed in 0.055359 second(s), 19 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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