Matlab 中字符串、字符串的单元格数组、字符串的向量和字符串矩阵之间的区别



我正在尝试编写一个例程,可以将任何类型的此类输入打印到文本文件中。

如何区分单字符串、字符串单元格数组、字符串向量和字符串矩阵?

即我想区分,

  1. 'My name is X'
  2. {'My', 'name', 'is', 'X'}
  3. ['My', 'name', 'is', 'X']
  4. ['My', 'name' ; 'is', 'X']

我写了以下例程。但是,它没有按预期工作。例如

string_list = ['my', ' ', 'name', 'is', ' ', 'xyz!'];
write_string('write_string.txt', string_list);

string_list = 'my name is xyz!';
write_string('write_string.txt', string_list);

输出

m   y       n   a   m   e   i   s       x   y   z   !   

源代码

function write_string(file_name, string_list)
    mode = 'a';
    fid = fopen(file_name, mode);    
    d = size(string_list);
    l = length(d);
    % vector or cell-array
    if(l==2)
        N = length(string_list);
        % a cell array of strings
        if(iscell(string_list))    
            display('Cell array');
            for k=1:N
                fprintf(fid, '%st', string_list{k});
            end
            fprintf(fid, 'n');
        % a vector of strings
        elseif(isvector(string_list))
            display('Vector');
            for k=1:N
                fprintf(fid, '%st', string_list(k));
            end
            fprintf(fid, 'n');
        % a single string    
        else
            display('single string');
            fprintf(fid, '%st', string_list);
            fprintf(fid, 'n');
        end
    % A matrix of strings
    elseif(l==3)
        % TODO
        fprintf(fid, 'n');
    end   
    fclose(fid);
end

您可能会感到困惑,因为您没有意识到您并没有真正创建字符串数组,而是在创建字符矩阵。

您的string_list是一个 1x14 的 chars: my nameis xyz! 矩阵(请注意,您在 nameis 之间缺少一个空格(。 然后在您的代码中,fprintf(fid, '%st', string_list(k))获取该字符串的每个元素,并在元素之间用制表符打印它,这就是您得到的。

您有 2 个选择:

使用字符串的单元格数组(这是您的示例 2(。 在您的代码中,您可以使用 iscellstr 检查您是否有字符串(即字符(的单元格数组。 另请注意,您无需循环打印出来

if iscellstr(string_list)
   fprintf('%st',string_list{:});
else
   % just a char matrix
   fprintf('%st',string_list);
end

或者,如果您使用的是最新版本的 MATLAB(我认为是 R2016b 或更高版本(,那么有一个字符串数据类型,它是使用双引号而不是单引号创建的

string_list = ["my", " ", "name", "is", " ", "xyz!"];
if isstring(string_list)
   fprintf('%st',string_list)
end

最新更新