这是我的程序代码:
fileID = fopen('PROBSET_102.csv','w');
a= 3;
lamda = 1.54;
fprintf(fileID, ' h, k, l ,d, theta \n');
for h = -8:8
for k = -8:8
for l = -8:8
d = sqrt((a^2)/(h^2 + k^2 + l^2));
c = (lamda/(2*d));
if c>1
theta = ('out of range');
else
theta = asind(c);
end
fprintf(fileID, ' %d, %d, %d, %d, %d\n',h,k,l,d,theta);
end
end
end
fclose(fileID);
我正在尝试在表格上打印以下值:h,k,l,d,theta。但是当c值大于1时,theta列应显示超出范围'而不是实际的数字输出。请帮忙。
答案 0 :(得分:0)
您需要将fprintf
次调用转移到c
的逻辑中。使用上述格式字符串时,fprintf
来电正在尝试将theta
打印为字符串时的双倍。
这能为您提供您期望的内容吗?
fileID = fopen('PROBSET_102.csv','w');
a= 3;
lamda = 1.54;
fprintf(fileID, ' h, k, l ,d, theta \n');
for h = -8:8
for k = -8:8
for l = -8:8
d = sqrt((a^2)/(h^2 + k^2 + l^2));
c = (lamda/(2*d));
if c>1
theta = ('out of range');
fprintf(fileID, ' %d, %d, %d, %d, %s\n',h,k,l,d,theta);
else
theta = asind(c);
fprintf(fileID, ' %d, %d, %d, %d, %d\n',h,k,l,d,theta);
end
end
end
end
fclose(fileID);
答案 1 :(得分:0)
使用%d
中的fprintf
FormatSpec,您只能导出整数,而不能导出字符串。
您必须在条件中修改fprintf
中的FormatSpec:
% ...
if c>1
theta = ('out of range');
fprintf(fileID, ' %d, %d, %d, %d, %s\n',h,k,l,d,theta);
else
theta = asind(c);
fprintf(fileID, ' %d, %d, %d, %d, %d\n',h,k,l,d,theta);
end
% ...
或简单地说:
% ...
if c>1
fprintf(fileID, ' %d, %d, %d, %d, out of range\n',h,k,l,d);
else
theta = asind(c);
fprintf(fileID, ' %d, %d, %d, %d, %d\n',h,k,l,d,theta);
end
% ...
答案 2 :(得分:0)
正如另一个建议的那样,您的代码错误是因为您要向fprintf
发送不同类型的数据。您可以为format
指定不同的fprintf
,并在代码的条件部分使用此特定格式调用它(其他2个解决方案将向您展示如何执行此操作)。
如果您希望将fprintf
调用保留在条件分支之外,请确保参数theta
始终为同一类型(在这种情况下为string
)。
由于最终结果是将数字转换为文件中的字符串,我们可以提前为此变量执行此操作,并确保fprintf
始终收到相同的类型。
if c>1
theta = 'out of range' ; %// this is a string
else
theta = sprintf( '%d' , asind(c) ) ; %// this is also a string
end
fprintf(fileID, ' %d, %d, %d, %d, %s\n',h,k,l,d,theta); %// last parameter printed is a string
如果您对“超出范围”值应显示的文本(即如果您可以接受改为使用“NaN”)进行灵活处理,那么NaN
(它代表 N ot A N umber,但这里并不重要)是一个有效的数字双精度fprintf
(和系列)函数可以无缝处理的值。
这意味着您可以摆脱三重嵌套for
循环并对您的完整代码进行矢量化。在我的机器上它执行速度提高了大约10倍(计算+文件写入),但你的里程可能会有所不同。如果你打算扩大网格尺寸,速度的提升将会更加有趣,尽管存在大小会使内存成为你的限制因素。
矢量化代码如下:
a= 3;
lamda = 1.54;
gridBase = -8:8 ; %// create a vector [-8 -7 -6 .... 6 7 8]
[L,K,H] = ndgrid(gridBase,gridBase,gridBase) ; %// Generate a grid
D = sqrt( (a.^2) ./ (H.^2 + K.^2 + L.^2) ); %// calculate D in one block (over the full grid)
C = lamda ./ (2.*D); %// same for C
C(C>1) = NaN ; %// make values of C>1 stand out (assign then to "Not a Number" NaN)
A = [H(:) K(:) L(:) D(:) C(:)] ; %// collate all that in a big table (equivalent to what you'll have in your file)
%// now write the array into file
fileID = fopen('PROBSET_102_alternate.csv','w');
fprintf(fileID, ' h, k, l ,d, theta \n'); %// write header line
fprintf(fileID, ' %d, %d, %d, %d, %d\n' , A.'); %'// let Matlab manage the write loop in the background (much faster)
fclose( fileID);
如果您需要了解代码,我邀请您逐行运行(首先从小网格开始)并查看工作区资源管理器中的变量。