291517964 发表于 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
希望能得到大家的帮助!谢谢

liuyalong008 发表于 2013-6-25 09:10:49

assume that you have the cells s:s={'*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'
}
attach '\r\n' to each one:str=regexprep(s,'(.*)','$1\r\n')finally: repeat the strings and write them to txtfid = fopen(['hr.txt'],'w');
fprintf(fid,repmat(,1,1000));
fclose(fid)

291517964 发表于 2013-6-25 10:47:45

liuyalong008 发表于 2013-6-25 09:10 static/image/common/back.gif
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。还能帮我改改吗?

291517964 发表于 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变量是从一个文本文档里面读取
附件做详细的说明!

291517964 发表于 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

291517964 发表于 2013-6-26 18:53:23

291517964 发表于 2013-6-25 18:00 static/image/common/back.gif
附加说明:
*SET_NODE_LIST
i                %i=1


大家有时间的帮帮忙呀!感谢

lin2009 发表于 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

291517964 发表于 2013-6-26 20:27:55

理解完全正确啊!

291517964 发表于 2013-6-26 20:29:09

帮忙搞定了吗?
我弄了两三天了,自己也懂了一点点!谢谢哦

291517964 发表于 2013-6-27 09:16:29

291517964 发表于 2013-6-26 20:29 static/image/common/back.gif
帮忙搞定了吗?
我弄了两三天了,自己也懂了一点点!谢谢哦

请大家帮帮忙啊!

liuyalong008 发表于 2013-6-27 11:29:42


临渊慕鱼,不如退而结网,你思考这么几天为什么不尝试用循环写写呢?s={'*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'
}

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

struct_s=repmat(s,iter,1)
struct_s(2:7:end)=i
struct_s(3:7:end)=node
struct_s(5:7:end)=line5
struct_s(7:7:end)=line7

str=regexprep(struct_s,'(.*)','$1\r\n');
fid = fopen(['test.txt'],'w');
fprintf(fid,);
fclose(fid)

>> struct_s

struct_s =

    '*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'
    '2'
    '672'
    '*DEFINE_CURVE'
    '2,0,1.0,1.0,0.0,0.0'
    '*LOAD_NODE_LIST'
    '1,2,2,1,0'
    '*SET_NODE_LIST'
    '3'
    '672'
    '*DEFINE_CURVE'
    '3,0,1.0,1.0,0.0,0.0'
    '*LOAD_NODE_LIST'
    '1,3,3,1,0'
    '*SET_NODE_LIST'
    '4'
    '673'
    '*DEFINE_CURVE'
    '1,0,1.0,1.0,0.0,0.0'
    '*LOAD_NODE_LIST'
    '2,1,4,1,0'
    '*SET_NODE_LIST'
    '5'
    '673'
    '*DEFINE_CURVE'
    '2,0,1.0,1.0,0.0,0.0'
    '*LOAD_NODE_LIST'
    '2,2,5,1,0'
    '*SET_NODE_LIST'
    '6'
    '673'
    '*DEFINE_CURVE'
    '3,0,1.0,1.0,0.0,0.0'
    '*LOAD_NODE_LIST'
    '2,3,6,1,0'

291517964 发表于 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)

291517964 发表于 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

291517964 发表于 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

291517964 发表于 2013-6-27 15:10:43

希望能在我的程序的基础上稍作改进

lin2009 发表于 2013-6-27 18:53:25

291517964 发表于 2013-6-27 15:10 static/image/common/back.gif
希望能在我的程序的基础上稍作改进

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

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

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

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

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

291517964 发表于 2013-6-27 19:59:56

lin2009 发表于 2013-6-27 18:53 static/image/common/back.gif
你的程序比你的问题本身更难懂,而且一点儿都不规范。
首先文件名不规范,用x,y,z还就算了,用数字3给文 ...

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

291517964 发表于 2013-6-27 23:08:38

291517964 发表于 2013-6-27 19:59 static/image/common/back.gif
谢谢你,能加你的qq吗?程序还是出现了一些问题

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

lengyunfeng 发表于 2013-6-27 23:34:57

本帖最后由 lengyunfeng 于 2013-6-27 23:36 编辑

291517964 发表于 2013-6-27 23:08 http://forum.simwe.com/static/image/common/back.gif
可是发了好多个贴还是没有解决我的问题啊

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

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

291517964 发表于 2013-6-27 23:53:54

lin2009 发表于 2013-6-27 18:53 static/image/common/back.gif
你的程序比你的问题本身更难懂,而且一点儿都不规范。
首先文件名不规范,用x,y,z还就算了,用数字3给文 ...

仔细看看了这个,感觉挺不错的!自己修改了一下能达到自己的要求!再与其它的部分整合一下应该就可以了!在这里表示特别感谢!
页: [1] 2
查看完整版本: 求助编一个小程序