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

求助编一个小程序

[复制链接]
发表于 2013-6-24 20:59:53 | 显示全部楼层 |阅读模式 来自 北京
编程实现对i,j,k,node变量的循环!
for i=1:1000
fid = fopen(['hr.txt'],'w');
fprintf(fid,'*SET_NODE_LIST\n');
fprintf(fid,'i\n');
fprintf(fid,'node\n');
fprintf(fid,'*DEFINE_CURVE\n');
fprintf(fid,'j,0,1.0,1.0,0.0,0.0\n');
fprintf(fid,'*LOAD_NODE_LIST\n');
fprintf(fid,'i,k,j,1.0\n');
end
不循环得到的格式如下:
*SET_NODE_LIST
i
node
*DEFINE_CURVE
j,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
i,k,j,1.0
希望能得到大家的帮助!谢谢
发表于 2013-6-25 09:10:49 | 显示全部楼层 来自 北京
Simdroid开发平台
assume that you have the cells s:
  1. s={'*SET_NODE_LIST'
  2. 'i'
  3. 'node'
  4. '*DEFINE_CURVE'
  5. 'j,0,1.0,1.0,0.0,0.0'
  6. '*LOAD_NODE_LIST'
  7. 'i,k,j,1.0'
  8. }
复制代码
attach '\r\n' to each one:
  1. str=regexprep(s,'(.*)','$1\r\n')
复制代码
finally: repeat the strings and write them to txt
  1. fid = fopen(['hr.txt'],'w');
  2. fprintf(fid,repmat([str{:}],1,1000));
  3. fclose(fid)
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-25 10:47:45 | 显示全部楼层 来自 北京
liuyalong008 发表于 2013-6-25 09:10
assume that you have the cells s:attach '\r\n' to each one:finally: repeat the strings and write th ...

谢谢你,但是我的变量i是要从1变到1000的,而不是重复1000次i。还能帮我改改吗?

点评

请把问题描述详细一点  发表于 2013-6-25 10:58
回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-25 11:27:45 | 显示全部楼层 来自 北京
问题描述:通过循环形成以下的格式
*SET_NODE_LIST
i
node
*DEFINE_CURVE
j,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
i,k,j,1.0
里面的i,j,k,node是变量,node变量是从一个文本文档里面读取
附件做详细的说明!

本帖子中包含更多资源

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

×

点评

不要文档,你最好把内容贴出来一部分 没人对下载你的文档感兴趣  发表于 2013-6-25 12:10
回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-25 18:00:04 | 显示全部楼层 来自 北京
附加说明:
*SET_NODE_LIST
i                %i=1
node             %从数字node里面读取第一个数
*DEFINE_CURVE
j,0,1.0,1.0,0.0,0.0   %j=1
*LOAD_NODE_LIST
i,k,j,1.0      %i=1,j=1,k=1
*SET_NODE_LIST   %i=1
i                 %i=1
node              %从数字node里面读取第一个数
*DEFINE_CURVE
j,0,1.0,1.0,0.0,0.0   %j=2
*LOAD_NODE_LIST
i,k,j,1.0        %i=1,j=2,k=2
*SET_NODE_LIST
i                 %i=1
node              %从数字node里面读取第一个数
*DEFINE_CURVE
j,0,1.0,1.0,0.0,0.0    %j=3
*LOAD_NODE_LIST
i,k,j,1.0        %i=1,j=3,k=3
i,j,k对应的变化   
%1至7行为一个循环体  
i=1,j=1,k=1        node变量为node文件中的1个数
i=1,j=2,k=2        node变量为node文件中的1个数
i=1,j=3,k=3        node变量为node文件中的1个数
i=2,j=4,k=1        node变量为node文件中的2个数
i=2,j=5,k=2        node变量为node文件中的2个数
i=2,j=6,k=3        node变量为node文件中的2个数
i=3,j=7,k=1        node变量为node文件中的3个数
i=3,j=8,k=2        node变量为node文件中的3个数
i=3,j=9,k=3        node变量为node文件中的3个数
......
i=6,j=18,k=1      node变量为node文件中的6个数
i=6,j=18,k=2      node变量为node文件中的6个数
i=6,j=18,k=3      node变量为node文件中的6个数
node文件为一列
672
673
674
675
676
677
回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-26 18:53:23 | 显示全部楼层 来自 北京
291517964 发表于 2013-6-25 18:00
附加说明:
*SET_NODE_LIST
i                %i=1

大家有时间的帮帮忙呀!感谢
回复 不支持

使用道具 举报

发表于 2013-6-26 19:21:12 | 显示全部楼层 来自 英国
代码不难,但是看懂你的意思要费一些劲。
特别是你要自己寻找、归纳隐含的规律性内容:
帮你梳理一下你的问题。

因要在某软件中生成动画所需的代码(文件),需要用Matlab要产生90个代码段(j = 1 : 90)
各个代码段的模式如下:

*SET_NODE_LIST
i
node
*DEFINE_CURVE
j,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
i,k,j,1.0


代码段模式中的各变量变化规律如下
j = 1:90
i = 1,1,1,2,2,2,...,30,30,30 (共90个,自然数序列,每个自然数重复3次)
j = 1,2,3,1,2,3,...1,2,3       (1,2,3 重复30遍)
node变量的取值由 i 决定。
设node变量是在mynode数组(存在在node.txt文件中)中取值的,则第 j 代码段的 node = mynode(i)

因此,各个代码段的模式可重写如下:

*SET_NODE_LIST
i
mynode(i)
*DEFINE_CURVE
j,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
i,k,j,1.0

最终的输出代码内容如下:
*SET_NODE_LIST
1
672
*DEFINE_CURVE
1,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
1,1,1,1.0

*SET_NODE_LIST
1
672
*DEFINE_CURVE
2,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
1,2,2,1.0

*SET_NODE_LIST
1
672
*DEFINE_CURVE
3,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
1,3,3,1.0

*SET_NODE_LIST
2
673
*DEFINE_CURVE
4,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
2,1,4,1.0

*SET_NODE_LIST
2
673
*DEFINE_CURVE
5,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
2,2,5,1.0

*SET_NODE_LIST
2
673
*DEFINE_CURVE
6,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
2,3,6,1.0

*SET_NODE_LIST
3
674
*DEFINE_CURVE
7,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
3,1,7,1.0

*SET_NODE_LIST
3
674
*DEFINE_CURVE
8,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
3,2,8,1.0

*SET_NODE_LIST
3
674
*DEFINE_CURVE
9,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
3,3,9,1.0

...
...

*SET_NODE_LIST
30
743
*DEFINE_CURVE
90,0,1.0,1.0,0.0,0.0
*LOAD_NODE_LIST
30,3,90,1.0

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-26 20:27:55 | 显示全部楼层 来自 北京
理解完全正确啊!

点评

是你自己表述不清,还得要给你帮助的人费这么大劲  发表于 2013-6-27 11:27
回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-26 20:29:09 | 显示全部楼层 来自 北京
帮忙搞定了吗?
我弄了两三天了,自己也懂了一点点!谢谢哦
回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-27 09:16:29 | 显示全部楼层 来自 北京
291517964 发表于 2013-6-26 20:29
帮忙搞定了吗?
我弄了两三天了,自己也懂了一点点!谢谢哦

请大家帮帮忙啊!

评分

2

查看全部评分

回复 不支持

使用道具 举报

发表于 2013-6-27 11:29:42 | 显示全部楼层 来自 北京

临渊慕鱼,不如退而结网,你思考这么几天为什么不尝试用循环写写呢?
  1. s={'*SET_NODE_LIST'
  2. 'i'
  3. 'node'
  4. '*DEFINE_CURVE'
  5. 'j,0,1.0,1.0,0.0,0.0'
  6. '*LOAD_NODE_LIST'
  7. 'i,k,j,1.0'
  8. }

  9. iter=90;
  10. i=regexp(sprintf('%d ',1:iter),'\d+','match')
  11. node=regexp(sprintf('%d ',repmat(672:672+iter/3-1,3,1)),'\d+','match')
  12. line5=regexp(sprintf('%d,0,1.0,1.0,0.0,0.0 ',repmat(1:3,1,iter/3)),'[\w,.]+','match')
  13. line7=regexp(sprintf('%d,%d,%d,1,0 ',...
  14.     [reshape(repmat(1:iter/3,3,1),1,[]);repmat(1:3,1,iter/3);1:iter]),'[\w,.]+','match')

  15. struct_s=repmat(s,iter,1)
  16. struct_s(2:7:end)=i
  17. struct_s(3:7:end)=node
  18. struct_s(5:7:end)=line5
  19. struct_s(7:7:end)=line7

  20. str=regexprep(struct_s,'(.*)','$1\r\n');
  21. fid = fopen(['test.txt'],'w');
  22. fprintf(fid,[str{:}]);
  23. fclose(fid)

复制代码
  1. >> struct_s

  2. struct_s =

  3.     '*SET_NODE_LIST'
  4.     '1'
  5.     '672'
  6.     '*DEFINE_CURVE'
  7.     '1,0,1.0,1.0,0.0,0.0'
  8.     '*LOAD_NODE_LIST'
  9.     '1,1,1,1,0'
  10.     '*SET_NODE_LIST'
  11.     '2'
  12.     '672'
  13.     '*DEFINE_CURVE'
  14.     '2,0,1.0,1.0,0.0,0.0'
  15.     '*LOAD_NODE_LIST'
  16.     '1,2,2,1,0'
  17.     '*SET_NODE_LIST'
  18.     '3'
  19.     '672'
  20.     '*DEFINE_CURVE'
  21.     '3,0,1.0,1.0,0.0,0.0'
  22.     '*LOAD_NODE_LIST'
  23.     '1,3,3,1,0'
  24.     '*SET_NODE_LIST'
  25.     '4'
  26.     '673'
  27.     '*DEFINE_CURVE'
  28.     '1,0,1.0,1.0,0.0,0.0'
  29.     '*LOAD_NODE_LIST'
  30.     '2,1,4,1,0'
  31.     '*SET_NODE_LIST'
  32.     '5'
  33.     '673'
  34.     '*DEFINE_CURVE'
  35.     '2,0,1.0,1.0,0.0,0.0'
  36.     '*LOAD_NODE_LIST'
  37.     '2,2,5,1,0'
  38.     '*SET_NODE_LIST'
  39.     '6'
  40.     '673'
  41.     '*DEFINE_CURVE'
  42.     '3,0,1.0,1.0,0.0,0.0'
  43.     '*LOAD_NODE_LIST'
  44.     '2,3,6,1,0'
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-27 14:56:51 | 显示全部楼层 来自 北京
我自己写的程序
clear,clc

fidx = fopen('x.txt');
fidy = fopen('y.txt');
fidz = fopen('z.txt');
fidn = fopen('node.txt');
fid1 = fopen('3.txt','w');
%%
i = 1;
while ~feof(fidx)
    n = textscan(fidx,'%d',1);
    x{i} = textscan(fidx,'%f %f',n{1});
    i = i + 1;
end
x = cellfun(@(a)cell2mat(a),x,'un',0);
%%
j = 1;
while ~feof(fidy)
    m = textscan(fidy,'%d',1);
    y{j} = textscan(fidy,'%f %f',m{1});
    j = j + 1;
end
y = cellfun(@(a)cell2mat(a),y,'un',0);
%%
k = 1;
while ~feof(fidz)
    p = textscan(fidz,'%d',1);
    z{k} = textscan(fidz,'%f %f',p{1});
    k = k + 1;
end
z = cellfun(@(a)cell2mat(a),z,'un',0);
%%
node = textscan(fidn,'%d');
%% 这个循环不会  目的见说明
KK=1;
JJ=1;
for II = 1:numel(x)%,j=1:3*numel(x)
         fprintf(fid1,'*SET_NODE_LIST\r\n%d\r\n%d\r\n',II,node{1}(II));
         fprintf(fid1,'*LOAD_NODE_LIST\r\n%d,%d,%d,1.0\r\n',II,KK,JJ);
         fprintf(fid1,'*LOAD_NODE_LIST\r\n%d,%d,%d,1.0\r\n',II,KK+1,JJ);
         fprintf(fid1,'*LOAD_NODE_LIST\r\n%d,%d,%d,1.0\r\n',II,KK+2,JJ);
end
fclose(fid1)
回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-27 15:05:10 | 显示全部楼层 来自 北京
循环要得到的内容:
*SET_NODE_LIST
i            %i=1
672          %node文件的第一个数
*LOAD_NODE_LIST
i,k,j,1.0    %i=1,k=1,j=1
*LOAD_NODE_LIST
i,k,j,1.0    %i=1,k=2,j=2
*LOAD_NODE_LIST
i,k,j,1.0    %i=1,k=3,j=3
*SET_NODE_LIST
i            %i=2
673          %node文件的第二个数
*LOAD_NODE_LIST
i,k,j,1.0    %i=2,k=1,j=4
*LOAD_NODE_LIST
i,k,j,1.0    %i=2,k=2,j=5
*LOAD_NODE_LIST
i,k,j,1.0    %i=2,k=3,j=6
*SET_NODE_LIST
i            %i=3
674          %node文件的第三个数
*LOAD_NODE_LIST
i,k,j,1.0    %i=3,k=1,j=7
*LOAD_NODE_LIST
i,k,j,1.0    %i=3,k=2,j=8
*LOAD_NODE_LIST
i,k,j,1.0    %i=3,k=3,j=9
依次类推
......
*SET_NODE_LIST
i            %i=n
第n个数          %node文件的第n个数
*LOAD_NODE_LIST
i,k,j,1.0    %i=n,k=1,j=3*n-2
*LOAD_NODE_LIST
i,k,j,1.0    %i=n,k=2,j=3*n-1
*LOAD_NODE_LIST
i,k,j,1.0    %i=n,k=3,j=3*n
回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-27 15:09:46 | 显示全部楼层 来自 北京
KK=1;
JJ=1;
for II = 1:numel(x)%,j=1:3*numel(x)
         fprintf(fid1,'*SET_NODE_LIST\r\n%d\r\n%d\r\n',II,node{1}(II));
         fprintf(fid1,'*LOAD_NODE_LIST\r\n%d,%d,%d,1.0\r\n',II,KK,JJ);
         fprintf(fid1,'*LOAD_NODE_LIST\r\n%d,%d,%d,1.0\r\n',II,KK+1,JJ);
         fprintf(fid1,'*LOAD_NODE_LIST\r\n%d,%d,%d,1.0\r\n',II,KK+2,JJ);
end
这里面的II,JJ,KK变量就是上面要得到内容的i,j,k
回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-27 15:10:43 | 显示全部楼层 来自 北京
希望能在我的程序的基础上稍作改进
回复 不支持

使用道具 举报

发表于 2013-6-27 18:53:25 | 显示全部楼层 来自 英国
291517964 发表于 2013-6-27 15:10
希望能在我的程序的基础上稍作改进

你的程序比你的问题本身更难懂,而且一点儿都不规范。
首先文件名不规范,用x,y,z还就算了,用数字3给文件命名,你让Matlab怎么想?
它怎么想也想不通数字3后面还有玄机,最后不是它崩溃了,就是你崩溃了!

逻辑不清。没看出你的代码的框架和意图。
x.txt,y.txt,z.txt是什么文件也没交代,问题弄得越来越复杂了。
x,y,z既作为文件名又作为变量名(x,y,z作为文件名本身就不妥),合适吗?
就算是作为变量名的x,y,z 到后面到底有什么用呢?没看出来有什么用处,而且y,z直接消失。
以上这些好像不关Matlab什么事?

建议初学者自己多上机,多看看在线帮助,编程时多加入注释语句和必要的空行。

给一个简单易懂的代码给你参考:
  1. fid = fopen('node.txt', 'r');
  2. mynode = fscanf(fid, '%d');    % 将node文件内容作为整数类型读入变量mynode.
  3. fclose(fid);

  4. fid2 = fopen('nodefile.txt', 'w'); % nodefile.txt 为存放最终代码的文件。
  5. for j = 1 : 90                           % 90是nodefile.txt中代码段数目。按需修改。
  6.    
  7.     i = ceil(j/3);  % i = 1, 1, 1, 2, 2, 2, ...自然数序列, 每个自然数重复3次
  8.     k = mod(j - 1, 3) + 1;     % k = 1, 2, 3, 1, 2, 3, ... (1, 2, 3 一直重复)
  9.    
  10.     % 每次循环以下fprintf()函数生成一个代码段。
  11.     fprintf(fid2, '*SET_NODE_LIST\n');
  12.     fprintf(fid2, '%d\n', i);
  13.     fprintf(fid2, '%d\n', mynode(i));
  14.     fprintf(fid2, '*DEFINE_CURVE\n');
  15.     fprintf(fid2, '%d, 0, 1.0, 1.0, 0.0, 0.0\n', j);
  16.     fprintf(fid2, '*LOAD_NODE_LIST\n');
  17.     fprintf(fid2, '%d, %d, %d, 1.0\n', i, k, j);
  18.    
  19. end
  20. fclose(fid2);
  21. type nodefile.txt   % 在命令窗口显示nodefile文件的内容。
复制代码

点评

老兄点评很到位!!!  发表于 2013-6-27 23:06

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-27 19:59:56 | 显示全部楼层 来自 北京
lin2009 发表于 2013-6-27 18:53
你的程序比你的问题本身更难懂,而且一点儿都不规范。
首先文件名不规范,用x,y,z还就算了,用数字3给文 ...

谢谢你,能加你的qq吗?程序还是出现了一些问题

点评

楼上的建议非常好,有问题在论坛讨论,加QQ大家应该不会有时间给你单独授课  发表于 2013-6-27 22:55
回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-27 23:08:38 | 显示全部楼层 来自 北京
291517964 发表于 2013-6-27 19:59
谢谢你,能加你的qq吗?程序还是出现了一些问题

可是发了好多个贴还是没有解决我的问题啊

点评

不敢称高手,只不过一直在用比较熟悉而已。Simwe是个技术交流论坛,一般不建议帮忙编写代码。有特殊问题的,也要把技术背景,问题本身等交代清楚  发表于 2013-6-28 03:33
此外你倒是把问题贴出来啊,你觉得你加了QQ就能把问题解释清楚吗?你自己做了多少尝试呢?  发表于 2013-6-27 23:19
你考虑是不是自己帖子的问题呢?高手如lin兄的解答也不能令你满意?  发表于 2013-6-27 23:15
回复 不支持

使用道具 举报

发表于 2013-6-27 23:34:57 | 显示全部楼层 来自 四川
本帖最后由 lengyunfeng 于 2013-6-27 23:36 编辑
291517964 发表于 2013-6-27 23:08
可是发了好多个贴还是没有解决我的问题啊


看到你的回复我就恨得牙痒痒
你的态度真像一类人
把自已的困难丢给了别人
就认为万事大吉了
别人有自己的事没搭理你
你还催来催去
最可气的是你连个问题都说不清楚

别人有别人的事
有有心人帮你解决是好事
但你要尊重别人的劳动成果
别把一切都当做理所应当

点评

同意! 建议网友与人讨论需"换位思考"!  发表于 2013-7-1 08:44
回复 不支持

使用道具 举报

 楼主| 发表于 2013-6-27 23:53:54 | 显示全部楼层 来自 北京
lin2009 发表于 2013-6-27 18:53
你的程序比你的问题本身更难懂,而且一点儿都不规范。
首先文件名不规范,用x,y,z还就算了,用数字3给文 ...

仔细看看了这个,感觉挺不错的!自己修改了一下能达到自己的要求!再与其它的部分整合一下应该就可以了!在这里表示特别感谢!
回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

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

GMT+8, 2024-9-23 00:45 , Processed in 0.075341 second(s), 25 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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