如何使用matlab在表中显示字符串

时间:2015-01-30 15:32:19

标签: string matlab

这是我的程序代码:

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列应显示超出范围'而不是实际的数字输出。请帮忙。

3 个答案:

答案 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);

如果您需要了解代码,我邀请您逐行运行(首先从小网格开始)并查看工作区资源管理器中的变量。