MATLAB。如果在另一行中找到行中的任何值,如何删除行?
我有一个矩阵,如图所示。在这个矩阵中,如果一行中的任何值在另一行中找到,我们将删除较短的行。例如,第2行到第5行都包含3,因此我只想保留第5行(具有大多数非零值的行),并删除所有其他行…请建议解决方案 谢谢MATLAB。如果在另一行中找到行中的任何值,如何删除行?,matlab,Matlab,我有一个矩阵,如图所示。在这个矩阵中,如果一行中的任何值在另一行中找到,我们将删除较短的行。例如,第2行到第5行都包含3,因此我只想保留第5行(具有大多数非零值的行),并删除所有其他行…请建议解决方案 谢谢 我并不是在这里编写所有代码,但下面是我将采取的解决步骤。您可能需要尝试不同的方法来获得预期的结果(即向量运算、while-loop、for-loop等) 问题 行是重复的,需要以更紧凑的形式减少 解决方案 抬头看 将向量(行)转换为字符串。这可以通过临时值来实现,例如tmpstr1=mat2
我并不是在这里编写所有代码,但下面是我将采取的解决步骤。您可能需要尝试不同的方法来获得预期的结果(即向量运算、while-loop、for-loop等) 问题 行是重复的,需要以更紧凑的形式减少 解决方案
tmpstr1=mat2str(yourMatrix(rowToBeCompared,:)代码>
strcmp
查看字符串字符(或字符串本身)是否相同:yourMatrix[rowToDelete,:]=[]删除一行,如果您觉得合适的话代码>
a='[ab+11]'代码>,我们可以从字符串中选择单个字符,如:
a(4)
ans = '+'
a(5)
ans = '1'
a(1)
and = '['
因此,您可以使用循环解析字符串:
for n = 1 : length(a)
if a(n) == '1' || a(n) == '0'
str(n) = a(n);
end
end
正如Sardar Usama所说,提供代码是很有帮助的,这样我们就可以复制并粘贴到我们自己的MATLAB工作区。我相信下面的代码应该可以工作。其思想是首先根据行中元素的数量对矩阵进行排序,然后循环并删除匹配的行。可能不是最有效的代码,但原则上应该有效。。更多解释请参见注释
% generating the data
M = zeros(6, 10);
M(2,1:3) = [3 8 10];
M(3,1:4) = [3 8 10 9];
M(4,1:5) = [3 8 10 9 7];
M(5,1:6) = [3 8 10 9 7 4];
M(6,1) = [5];
% sorting according to the number of non-zero elements
nr_of_nonzero = sum(M~=0, 2);
[~, sort_indices] = sort(nr_of_nonzero);
M_sorted = M(sort_indices,:);
M_sorted(M_sorted==0)=NaN; % should not compare 0s (?)
% get rid of the matches
for i=1:size(M_sorted, 1)-1
for j=(i+1):size(M_sorted, 1)
[C,ia,ib] = intersect(M_sorted(i,:),M_sorted(j,:));
if numel(C)>0
M_sorted(i,:) = NaN;
end
break;
end
end
% reorder
M(sort_indices,:) = M_sorted;
% remove all NaN rows
M(all(isnan(M),2),:) = [];
% back to 0s
M(isnan(M)) = 0;