【问题标题】:Appending string to Matlab array将字符串附加到 Matlab 数组
【发布时间】:2011-01-18 08:03:13
【问题描述】:

如何将字符串追加到 Matlab 数组列?

这是我正在尝试做的一个小代码sn-p:

for_loop
  filename = 'string';
  name=[name; filename]
end

【问题讨论】:

    标签: arrays string matlab append


    【解决方案1】:

    你走对了。使用 {} 构建元胞数组,如下所示

    stringtable = 'a string';
    for i = 1:3
        stringtable = {stringtable;new_string(i)}
    end
    

    应该做你想做的。

    【讨论】:

    • 使用 { ... } 像这样迭代构造最终会得到一个嵌套单元数组,如树或 Lisp 列表,而不是 cellstr。怎么样 "strs = {'a string'}; for i=1:3; strs = [strs; {new_string(i)}]; end" 或 "... strs{end+1} = new_string(i) ; ...”?
    【解决方案2】:

    如其他地方所述,在 MATLAB 中,数组中的所有字符串必须具有相同的长度。要拥有不同长度的字符串,请使用元胞数组:

    name = {};
    for i = somearray
      name = [name; {string}];
    end
    

    【讨论】:

      【解决方案3】:

      您需要使用元胞数组。如果事先知道迭代次数,我建议你预先分配:

      N = 10;
      names = cell(1,N);
      for i=1:N
          names{i} = 'string';
      end
      

      否则你可以这样做:

      names = {};
      for i=1:10
          names{end+1} = 'string';
      end
      

      【讨论】:

      • 哇,感谢 {end+1} 语法,我什至不知道在那种情况下存在“end”。
      • 是的 {end+1} 比 {length(..)+1} 好得多!
      • 我需要使用names 作为fopen 的输入,但是fopen 抱怨它的类型错误:cell。如何将单元格类型转换为字符串?
      【解决方案4】:

      正如其他答案所指出的,使用 cell arrays 可能是最直接的方法,这将导致您的变量 name 成为一个单元格数组,其中每个单元格元素都包含一个字符串。

      但是,还有另一个选项使用函数STRVCAT,它将垂直连接字符串。这将创建一个二维字符矩阵,而不是创建一个元胞数组,每行包含一个字符串。 STRVCAT 会在必要时自动用空格填充字符串的末端,以正确填充矩阵的行:

      >> string1 = 'hi';
      >> string2 = 'there';
      >> S = strvcat(string1,string2)
      
      S =
      
      hi
      there
      

      【讨论】:

        【解决方案5】:
        name=[];
        for_loop
            filename = 'string';
            name=[name; {filename}];
        end
        

        【讨论】:

          【解决方案6】:

          如果您使用如下所示的两个数组(A 和 B),您可以像处理其他矩阵一样附加它们。

          A = {'a' ; 'b' ; 'c'};
          B = {'1' ; '2' ; '3'};
          Result = { A{:,1} ; B{:,1} }
          
          Result = 
          
          'a'    'b'    'c'
          '1'    '2'    '3'
          

          【讨论】:

            【解决方案7】:

            我知道这是一个旧线程,但如果这就是你在循环中所做的一切,你似乎甚至不需要循环。你可以只使用垂直连接吗?

               mmm = {'str1'; 'str2'; 'str3'};
               temp = {'a'; 'b'; 'c'};
            
               mmm = [mmm; temp]
            
            mmm = 
            
                'str1'
                'str2'
                'str3'
                'a'
                'b'
                'c'
            

            【讨论】:

              【解决方案8】:

              使用strcat函数追加一行代码而不使用循环:

              A={'food','banana','orange'}
              

              A = '食物' '香蕉' '橙子'

              A = strcat(A,'s')
              

              A = '食物' '香蕉' '橙子'

              【讨论】:

              • 加1;谢谢!不知道 strcat 适用于大小不一的连接!
              【解决方案9】:

              为了完整起见,还应提及 MATLAB R2016b 中引入的新 string class;文本数据的容器以及一组便于文本操作的函数。

              为了和我的other example比较,这里是如何分配string array

              N = 10;
              names = strings(1,N);
              for i=1:N
                  names(i) = 'string';
              end
              

              这里是如何在不预分配的情况下动态扩展数组:

              names = strings(0);
              for i=1:10
                  names(end+1) = 'string';
              end
              

              (当然如果字符串都是相同的或者形成一个带有模式的序列,有更好的方法来创建没有循环的数组。上面只是一个逐个填充数组的例子一)。

              string 容器也可以与character arrayscell arrays of chars 相互转换。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2023-01-19
                • 2016-03-02
                • 2015-11-12
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-01-22
                相关资源
                最近更新 更多