声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1269|回复: 9

[编程技巧] 如何循环赋值给可变符号?

[复制链接]
发表于 2008-10-9 10:34 | 显示全部楼层 |阅读模式

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

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

x
matlab中,当数目比较大的时候,如何实现下面的赋值:
X1=1;
X2=2;
X3=3;
X4=4;
……
Xii=ii;
……

注意,此处要求不是
X(1)=1;
X(2)=2;
X(3)=3;
……
X(ii)=ii;
……
的形式
回复
分享到:

使用道具 举报

发表于 2008-10-9 12:13 | 显示全部楼层
为啥不能用数组形式呢?数组的方式会有很多方便之处的。

不过,如果楼主一定要那种形式的话,可以参考下面的方式实现:

  1. for ii=1:10
  2.      estr=sprintf('X%d=%d',[ii,ii]);
  3.     eval(estr);
  4. end
复制代码

[ 本帖最后由 sogooda 于 2008-10-9 12:35 编辑 ]
 楼主| 发表于 2008-10-9 15:28 | 显示全部楼层
首先感谢sogooda的热心!
我还想再进一步问一下,实质上我原始的问题是这样的:
有一个元胞数组A={[1 1] [12 1] [1 3] ……},A里面的元素数目N很大,我想把A{1}(即矩阵[1 1])赋值给X1,A{2}(即矩阵[1 2 1])赋值给X2,A{3}赋值给X3,A{4}赋值给X4,……等等,之所以要这样做是因为我需要把元胞数组A的每一个元素(即A{1},A{2},A{3},A{4},……)单独保存为一个ASCII文件(即一共N个文件),由于导出文件命令save('X1.txt','X1','-ASCII')中需要一个变量名Xii而不能采用X(ii)的格式,所以需要上述赋值。
不知道这个赋值命令如何实现,如果用
for ii=1:10
     estr=sprintf('X%d=%d',ii,A{ii});
    eval(estr);
end
好像不行,eval这里 通不过
另外,不知道有没有其他方式来把这些元素保存为文件?
发表于 2008-10-9 15:39 | 显示全部楼层
试试这个

  1. for ii=1:10
  2.      estr=sprintf('X%d=[%d %d]',[ii,A{ii}]);
  3.     eval(estr);
  4. end
复制代码

[ 本帖最后由 sogooda 于 2008-10-9 15:41 编辑 ]
 楼主| 发表于 2008-10-9 15:54 | 显示全部楼层
好像如果A{ii}是只有一行的矩阵是可以的,但如果A{ii}=[1 2;3 4]就不行了:
A={[1 1] [12 1] [1 3] [3 2;5 6]};
for ii=1:4
    estr=sprintf('X%d=[%d %d]',[ii,A{ii}]);
    eval(estr);
end

运行结果是:

>> A={[1 1] [12 1] [1 3] [3 2;5 6]};
for ii=1:4
    estr=sprintf('X%d=[%d %d]',[ii,A{ii}]);
    eval(estr);
end

X1 =

     1     1


X2 =

    12     1


X3 =

     1     3

??? Error using ==> horzcat
All matrices on a row in the bracketed expression must have the
same number of rows.

X4出不来
 楼主| 发表于 2008-10-9 16:05 | 显示全部楼层
补充一下,实际上A{ii}的格式一样:如
A={[1 1;2 3] [3 2;5 6] [4 5;10 10]};
如果格式不一样可能会很麻烦

运行如下:

A={[1 1;2 3] [3 2;5 6] [4 5;10 10]};
for ii=1:4
    estr=sprintf('X%d=[%d %d]',[ii A{ii}]);
    eval(estr);
end
??? Error using ==> horzcat
All matrices on a row in the bracketed expression must have the
same number of rows.

>>
发表于 2008-10-9 16:09 | 显示全部楼层

回复 6楼 wangyuhui82 的帖子

格式不一样也没你想的那么麻烦——不过,你有什么问题能不能一次说清楚?

  1. A={[1 1] [12 1] [1 3] [3 2;5 6]};
  2. for ii=1:4
  3.     estr=sprintf('X%d=A{%d}',[ii,ii]);
  4.     eval(estr);
  5. end
复制代码

[ 本帖最后由 sogooda 于 2008-10-9 16:17 编辑 ]

评分

1

查看全部评分

 楼主| 发表于 2008-10-9 16:11 | 显示全部楼层
这个可以了
A={[1 1;2 3] [3 2;5 6] [4 5;10 10]};
for ii=1:3
    estr=sprintf('X%d=[%d %d;%d %d]',ii,A{ii});
    eval(estr);
end

X1 =

     1     2
     1     3


X2 =

     3     5
     2     6


X3 =

     4    10
     5    10

但是有一个新的问题:那就是A{ii}中的矩阵也比较大,比如A{ii}都是100*2的矩阵,那estr=sprintf('X%d=[%d %d;%d %d]',ii,A{ii});中[%d %d;%d %d]要写成[%d %d;%d %d;%d %d;%d %d;%d %d;%d %d……]共一百行,不知道有没有其他办法?
发表于 2008-10-9 16:14 | 显示全部楼层

回复 8楼 wangyuhui82 的帖子

看7楼
 楼主| 发表于 2008-10-9 16:23 | 显示全部楼层
这下可以了,谢谢sogooda
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

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

GMT+8, 2024-9-23 03:29 , Processed in 0.064655 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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