我正在创建一个打开图像的程序,并使用MATLAB ginput命令存储x和y坐标,这些坐标在循环中操作以满足if语句的要求并输出对应于该区域的数字或字符串在ginput会话期间点击。同时,我使用input命令从命令窗口输入与这些数字相关的字符串。 ginput会话放在while循环中,因此特定区域中的单击将结束输入会话。对于每个会话(while循环),只需要命令窗口中的一个或两个输入。最后,我试图将所有数据存储在csv或txt文件中,但我希望将其列表,以便于阅读,即带有标题的行和列。我包括一些示例代码。我的问题是:1,如何将x和y坐标的输入转换为字符串?为数字执行此操作很简单,但我无法使用字符串。 2,任何有关将字符串和数字打印到列表文本或cdv文件的帮助都将不胜感激。
命令行输入:
prompt='Batter:';
Batter=input(prompt,'s');
While Loop:
count=1;
flag=0;
while(flag==0)
[x,y]= ginput(1);
if (y>539)
flag=1;
end
if x<594 && x>150 && y<539 && y>104
%it's in the square
X=x;
Y=y;
end
if x<524 && x>207 && y<480 && y>163
result='strike'
else
result='ball'
end
[x,y]= ginput(1);
pitch=0;
if x<136 && x>13
%its' pitch column
if y<539
pitch=6;
end
if y<465
pitch=5;
end
if y<390
pitch=4;
end
if y<319
pitch=3;
end
if y<249
pitch=2;
end
if y<175
pitch=1;
end
end
if pitch==0
else
plot(X,Y,'o','MarkerFaceColor',colors(pitch),'MarkerSize',25);
text(X,Y,mat2str(count));
end
count=count+1
M(count,:)=[X,Y,pitch];
end
对于上面的if语句系列,如果条件满足,我更喜欢字符串输出而不是数字1-6。 fprintf函数用于打印到文件,但我遇到了使用它组合字符串和数字的问题:
fileID = fopen('pitches.csv','w');
fid = fopen('gamedata.txt','w');
fmtString = [repmat('%s\t',1,size(Batter,2)-1),'%s\n'];
fprintf(fid,fmtString,Batter,result);
fclose(fid);
for i=1:length(M)
fprintf(fileID,'%6.2f %6.2f %d\n',M(i,1),M(i,2),M(i,3));
end
fclose(fileID);
我尝试将字符串句柄与M列一起添加到fprintf命令,但是会出错。我要么将它们存储在一个数组中(如何?)并将所有数组列打印到文件中,或者使用其他方法。我也试过了一个可编写方法的版本:
writetable(T,'tabledata2.txt','Delimiter','\t','WriteRowNames',true)
但是我无法让一切工作正常。非常感谢您的帮助。
答案 0 :(得分:2)
让我们一次解决一个问题:
1,如何将x和y坐标的输入转换为字符串?
您可以在MATLAB中使用sprintf
命令。它采用与fprintf
完全相同的语法,但是此函数的输出将为您提供所需的字符串/字符数组。
2,任何有关将字符串和数字打印到列表文本或cdv文件的帮助都将不胜感激。
您仍然可以使用fprintf
,但您可以指定矩阵作为输入。因此,您可以这样做:
fprintf(fileID,'%6.2f %6.2f %d\n', M.');
这会将整个矩阵写入文件。但是,必须小心,因为MATLAB以列主格式写入文件。这意味着它将在进入下一列之前沿着行遍历。如果要逐行写入数据,则需要首先转置矩阵,以便在遍历行时,它基本上可以执行您想要的操作。在开始尝试将字符串写入文件之前,您需要牢记这一点。我建议您将每个字符串放在cell
数组中,然后循环遍历cell
数组中的每个元素,并逐行逐个写入每个字符串。
希望这有助于推动您朝着正确的方向前进。在评论中回复我,如果您需要更多帮助,我们可以继续讨论。