Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.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
Arrays 通过投票在不同大小的多个数组之间找到相等的行_Arrays_Matlab_Compare - Fatal编程技术网

Arrays 通过投票在不同大小的多个数组之间找到相等的行

Arrays 通过投票在不同大小的多个数组之间找到相等的行,arrays,matlab,compare,Arrays,Matlab,Compare,假设我有5个不同大小的数组。在我的例子2中,所有数组的列数相同,但行数不同。我需要找到至少3个这样的数组中出现的行的元素 现在,我使用ismember比较两个数组,然后将结果与第三个数组进行比较,然后保存所有三个数组中出现的行值。我对3个数组的每一个可能组合都这样做;基本上就我而言,我总共有10次这样的行动。这就像从5个选项中选择3个而不重复 它可以工作,但我正在寻找一个更高效的实现。特别是,我正在寻找任何可以通过投票来实现这一点的实现。这就像拥有不同大小的集合,并试图找到大多数集合中出现的元素

假设我有5个不同大小的数组。在我的例子2中,所有数组的列数相同,但行数不同。我需要找到至少3个这样的数组中出现的行的元素

现在,我使用
ismember
比较两个数组,然后将结果与第三个数组进行比较,然后保存所有三个数组中出现的行值。我对3个数组的每一个可能组合都这样做;基本上就我而言,我总共有10次这样的行动。这就像从5个选项中选择3个而不重复


它可以工作,但我正在寻找一个更高效的实现。特别是,我正在寻找任何可以通过投票来实现这一点的实现。这就像拥有不同大小的集合,并试图找到大多数集合中出现的元素,在我的例子中,5个数组中有3个数组。

不确定投票是什么意思,但我认为这正是你想要的

它创建一个由数组中的所有行组成的唯一大矩阵。对每个单独的数组按唯一数组的行执行
ismember
。将
ismember
相加,以计算每个唯一行在数组集合中存在的次数

然后,可以使用该计数返回至少出现了
minNum
的新数组

你可以这样称呼它:

>> [outRows, uRows, memCount]= getRowDuplicates(3,a,b,c,d,e)
其中a、b、c、d、e是数组,3是最小出现次数

function [outRows, uRows, memCount]= getRowDuplicates(minNum,varargin)

uRows = unique(vertcat(varargin{:}),'rows');
memCount = false(size(uRows,1),1);
for j = 1:nargin-1
    memCount = memCount + ismember(uRows,varargin{j},'rows');    
end
rowIdx = memCount >= minNum;
outRows = uRows(rowIdx,:);

感谢Aero Engy提供解决方案!这是我自己的尝试,在重写了我最初的、不是很有效的实现之后。我想有人会觉得它有用:

function [majorityPts] = MajorityPointSelection(Mat, numMajority)
    result = vertcat(Mat{:});
    allUniq = unique(result(:,1:2),'rows');
    numUniq = size(allUniq,1);

    allUniq = [allUniq zeros(numUniq,1); zeros(size(result,1)-numUniq, 3)];
    for i = 1:numUniq
        sumNumRow = sum(result(:,1:2) == allUniq(i,1:2),1);
        allUniq(i,3) = sumNumRow(1);
    end

    allUniq(numUniq+1:end,:) = [];
    majorityPts = allUniq(allUniq(:,3)>=numMajority,1:2);
end

这里的
Mat
是一个单元格,它包含我想要比较的所有数组,以便找到至少出现在
numMajority
中的行,在我的例子中,
numMajority=3
。基本上,我首先将所有数组转储到一个大矩阵中(
result
),然后找到该矩阵的唯一行。最后,我计算每个唯一行的数量,并返回大多数数组中出现的点作为
majorityPts

可能重复的
@excaza
:根据我的理解,中提供的解决方案更适合于比较每对数组。例如,它将所有数组保存在一个单元格中,然后查找每对数组的交点。最后,查找唯一的行以及它们出现的数组。在我的问题中,似乎将所有数组放在一个大矩阵中更有效。我认为比较每一对数组需要更多的比较,这在这里似乎不是很有效。