String 重新排列包含字符串的单元格数组

String 重新排列包含字符串的单元格数组,string,matlab,replace,export-to-csv,cell-array,String,Matlab,Replace,Export To Csv,Cell Array,单元格数组中的内容如上图所示。我有两个问题: 我必须将列中的单元格移动到前面的单元格,只要有0s。例如,在行1中,1x7单元格必须位于1x19单元格之后,依此类推 执行此操作时,还应移动带有[]的单元格,以替换前面的0s 我尝试使用strncmp、ismember和其他函数,但是0抛出了错误 使用工作代码更新 代码如下: 但它并不能完成所有的工作。要复制的单元格必须从末尾删除 for m=1:200 for i=1:46 for j=1:199 try

单元格数组中的内容如上图所示。我有两个问题:

  • 我必须将列中的单元格移动到前面的单元格,只要有
    0s
    。例如,在
    行1
    中,
    1x7
    单元格必须位于
    1x19
    单元格之后,依此类推

  • 执行此操作时,还应移动带有
    []
    的单元格,以替换前面的
    0s

  • 我尝试使用
    strncmp
    ismember
    和其他函数,但是
    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
    我想问题是,你的零不是数字,而是字符串或字符。在这种情况下,只需将
    if
    -参数替换为从cell到matrix的转换
    cell2mat
    ,如下代码所示。希望这能解决你的问题

    如果没有,您能否发布用于创建零和其他元素的代码行

    编辑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
    位置,并将其替换为
    []

    我不确定这是否是关于运行时的有效解决方案。

    我不确定的是你的第七行。那里会发生什么?3个非零元素
    单元格
    是否转到
    单元格
    的位置,停留在原来的位置,还是返回一个插槽?

    这里有一种替代方法:不迭代数组,而是创建一个新的数组,只填充非零值(注意:如果要避免创建新数组,可以在循环中创建行的临时副本,清空数组中的行,然后覆盖)。通过一些巧妙的数组洗牌,您可以在不完全循环的情况下执行步骤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:查找非零
    非零=cellfun(@(x)~iscell(x)和&~isempty(x),标记);
    %#步骤2:创建一个新数组,所有数组都为空
    [nRows,nCols]=尺寸(标签);
    newTags=单元(nRows,nCols);
    %#步骤3:对于每行:复制非零条目
    [goodRows,goodCols]=查找(非零);
    对于iRow=1:nCols;
    myGoodCols=goodCols(goodRows==iRow);
    nGoodCols=长度(myGoodCols);
    如果nGoodCols>0&&nGoodCols
    但是在每一行/每一列中有不同数量的元素?如何处理?用
    []
    填充?是的。可以用[]。您可以在给定的exmaple中将
    1x7
    单元格写入第一个
    0
    ?唯一的问题是删除
    0
    ?或者您在写入方面也有问题吗?您可以发布您目前拥有的代码吗?我建议您在没有零的地方创建一个带true的t/f数组,然后创建一个包含所有
    []的新阵列
    ,并且,对于每一行,用非零项填充cols 1:n。@Jonas实际上我有一个带有此信息的t/f逻辑变量。使用此方法,我将矩阵中不存在的单元格归零-我不知道如何用每一行的非零单元格项填充列。在第7行中,0可以变为空。但是您的代码抛出此错误:使用cell2mat时出错(第53行)无法支持包含单元格数组或对象的单元格数组。如果使用cell2mat(test_mat(1,k))则移动零(第18行)时出错==0Ah我的代码只适用于用数字填充的矩阵,然后转换为单元格,这样你就可以在一个结构中存储不同大小的数据。单元格中有什么样的数据?字符串。这就是我提出这个问题的原因。否则很容易。@SharathChandra嘿,我想我修正了我的答案。如果你能测试一下,那会很好。O我没有尝试的一点是,如果列的最后一个元素是
    0
    会发生什么,如果没有代码来替换
    0
    with@SharathChandra我再次更改了代码。现在,如果列中没有更多的非零元素,它会将所有
    0
    替换为
    []
    %# 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