重新排列包含字符串的Cell数组

时间:2014-05-27 07:51:49

标签: string matlab replace export-to-csv cell-array

enter image description here

单元阵列中的内容如上图所示。我有两个问题:

  1. 我必须将列中的单元格移动到前面的单元格0s。例如,在row 1中,1x7单元格必须在1x19单元格之后进入单元格,依此类推。

  2. 执行此操作时,还应移动[]的单元格,替换前面的0s

  3. 我尝试使用strncmpismember和其他功能,但0会抛出错误。

    使用工作代码更新

    代码是这样的:

    但是,它并没有做所有的工作。必须从最后删除要复制的单元格。

    for m=1:200
    for i=1:46
        for j=1:199
    
            try
                if(tags{i,j}==0)
                    for k=j:199
                        tags{i,k}=tags{i,k+1};
                        tags{i,k+1}='';
                    end
                end
            catch exception
    
            end
        end
    end
    end
    

    编辑 - 问题的第2部分:尚未解决

    每个单元格都包含字符串。有什么办法可以把它们写到文本文件中吗? 单元格中的所有字符串必须位于同一行,后面是下一个单元格中字符串的新行。

    同样,我尝试使用了很多功能,但我无法正常使用。我只是将每个单元格中的第一个字符串添加到文本文件中。

2 个答案:

答案 0 :(得分:1)

这是另一种方法:不是迭代数组,而是创建一个新数组并仅填充非零值(注意:如果你想避免创建一个新数组,你可以在循环中创建一个行的临时副本,清空数组中的行,并覆盖)。通过一些聪明的数组改组,你可以完全没有循环的步骤3,顺便说一下。

%# step 1: find non-zeros
nonZeros = cellfun(@(x) ~iscell(x) && ~isempty(x), tags);

%# step 2: create new array with all empty
[nRows,nCols] = size(tags);
newTags = cell(nRows,nCols);

%# step 3: for every row: copy the non-zero entries
[goodRows,goodCols] = find(nonZeros);

for iRow = 1:nCols;
    myGoodCols = goodCols(goodRows==iRow);
    nGoodCols = length(myGoodCols);
    if nGoodCols > 0 && nGoodCols < nCols
       %# shift everything
       newTags(iRow, 1:nGoodCols) = tags(iRow,myGoodCols);
    end
end

%# step 4 : write out tags
fid = fopen('tags.txt','w+');
for iRow = 1:nRows
    for iCol = 1:nCols
        if ~isempty(tags{iRow,iCol})
        fprintf(fid,'row %i col%i : ',iRow,iCol);
        fprintf(fid,'%s ',tags{iRow,iCol}{:});
        fprintf(fid,'\n');
        end
    end
end

答案 1 :(得分:0)

编辑2
我想问题是,你的零不是数字,而是字符串或字符。在这种情况下,只需将if - 参数替换为从单元格到矩阵cell2mat的转换,如下面的代码所示。希望这能解决您的问题。

如果没有,你可以发布用于创建零和其他元素的代码行吗?

for k=1:200 %For looping on all columns 
    for i=1:46 %For  max rows
    try     
        if cell2mat(test_mat(1,i))== '0'
            test_mat{1,i}='';
            for j=i:46 % For max columns
              try
                if cell2mat(test_mat(1,j))~='0' 
                    test_mat{1,i}=test_mat{1,j};
                    test_mat{1,j}='';
                    break
                end
                catch exception
              end
            end

        end
    catch exception
    end
    end
end

修改1

 for k=1:200 %For looping on all columns 
    for i=1:46 %For  max rows
    try
        if test_mat{k,i}==0
            test_mat{k,i}='';
            for j=i:46 % For max columns
              try
                if test_mat{k,j}~=0 
                    test_mat{k,i}=test_mat{k,j};
                    test_mat{k,j}='';
                    break
                end
                catch exception
              end
            end
        end
    catch exception
    end
    end
 end

嘿,这应该知道正确地替换你的元素。
旧答案 嘿不确定一件事。但这应该有用

for k=1:max_row
   try
      if cell2mat(test_mat(1,k)) ==0 
         for j=k:max_row
           if cell2mat(test_mat(1,j)) ~= 0
               test_mat(1,k) = test_mat(1,j);
               test_mat(1,j) = {''};
               break
           end
         end
      end
      catch exception
   end
end

这里我只循环第一行(对于所有行,你可以添加另一个循环,包括这段代码)。第一个if检查元素是否为0.如果是,则第二个if检查同一行但后面的列中的非零元素。然后我将该元素写入0位置并将其替换为[]
我不确定它是否是关于运行时的有效解决方案。
我不确定的是你的第7行。那会发生什么? 3非零元素<1x7>cell是否会转到<1x11>cell位置,保持原位还是回到一个位置?