Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MATLAB。如果在另一行中找到行中的任何值,如何删除行?_Matlab - Fatal编程技术网

MATLAB。如果在另一行中找到行中的任何值,如何删除行?

MATLAB。如果在另一行中找到行中的任何值,如何删除行?,matlab,Matlab,我有一个矩阵,如图所示。在这个矩阵中,如果一行中的任何值在另一行中找到,我们将删除较短的行。例如,第2行到第5行都包含3,因此我只想保留第5行(具有大多数非零值的行),并删除所有其他行…请建议解决方案 谢谢 我并不是在这里编写所有代码,但下面是我将采取的解决步骤。您可能需要尝试不同的方法来获得预期的结果(即向量运算、while-loop、for-loop等) 问题 行是重复的,需要以更紧凑的形式减少 解决方案 抬头看 将向量(行)转换为字符串。这可以通过临时值来实现,例如tmpstr1=mat2

我有一个矩阵,如图所示。在这个矩阵中,如果一行中的任何值在另一行中找到,我们将删除较短的行。例如,第2行到第5行都包含3,因此我只想保留第5行(具有大多数非零值的行),并删除所有其他行…请建议解决方案

谢谢


我并不是在这里编写所有代码,但下面是我将采取的解决步骤。您可能需要尝试不同的方法来获得预期的结果(即向量运算、while-loop、for-loop等)

问题

行是重复的,需要以更紧凑的形式减少

解决方案

  • 抬头看
  • 将向量(行)转换为字符串。这可以通过临时值来实现,例如
    tmpstr1=mat2str(yourMatrix(rowToBeCompared,:)
  • 从头到尾解析第一个字符串,同时以相同的方式解析第二个字符串以进行比较
  • 使用
    strcmp
    查看字符串字符(或字符串本身)是否相同:
  • 使用
    yourMatrix[rowToDelete,:]=[]删除一行,如果您觉得合适的话
  • 试试看它是否有效

    注意-步骤3的扩展:

    如果我们有变量
    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;