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