单元阵列中的内容如上图所示。我有两个问题:
我必须将列中的单元格移动到前面的单元格0s
。例如,在row 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部分:尚未解决
每个单元格都包含字符串。有什么办法可以把它们写到文本文件中吗? 单元格中的所有字符串必须位于同一行,后面是下一个单元格中字符串的新行。
同样,我尝试使用了很多功能,但我无法正常使用。我只是将每个单元格中的第一个字符串添加到文本文件中。
答案 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
位置,保持原位还是回到一个位置?