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
Algorithm 如何查找矩阵中具有相同唯一和重复元素顺序但不一定具有相同值的行_Algorithm_Matlab_Matrix - Fatal编程技术网

Algorithm 如何查找矩阵中具有相同唯一和重复元素顺序但不一定具有相同值的行

Algorithm 如何查找矩阵中具有相同唯一和重复元素顺序但不一定具有相同值的行,algorithm,matlab,matrix,Algorithm,Matlab,Matrix,我不太清楚这个问题怎么表达。假设我有以下矩阵: A=[1 0 0; 0 0 1; 0 1 0; 0 1 1; 0 1 2; 3 4 4] 给定第1行,我希望找到所有行,其中: 第1行中唯一的元素在另一行的同一列中唯一,但不一定具有相同的值 如果第1行中有重复值的元素,则另一行中的相同列中也有重复值,但不一定是相同的值 例如,在矩阵A中,如果给我第1行,我希望找到第4行和第6行。现在无法测试这一点,但我认为以下方法可行: A=[1 0 0; 0 0 1;

我不太清楚这个问题怎么表达。假设我有以下矩阵:

A=[1 0 0;
   0 0 1;
   0 1 0;
   0 1 1;
   0 1 2;
   3 4 4]
给定第1行,我希望找到所有行,其中:

  • 第1行中唯一的元素在另一行的同一列中唯一,但不一定具有相同的值
  • 如果第1行中有重复值的元素,则另一行中的相同列中也有重复值,但不一定是相同的值

例如,在矩阵A中,如果给我第1行,我希望找到第4行和第6行。

现在无法测试这一点,但我认为以下方法可行:

A=[1 0 0;
   0 0 1;
   0 1 0;
   0 1 1;
   0 1 2;
   3 4 4];

B = zeros(size(A));

for ii = 1:size(A,1)
  r = A(ii,:);
  B(ii,1) = 1;
  for jj = 2:size(A,2)
    c = find(r(1:jj-1)==r(jj));
    if numel(c) > 0
      B(ii,jj) = B(ii,c);
    else
      B(ii,jj) = B(ii,jj-1)+1;
    end
  end
end
最后,我们有一个数组B,其中“相似的索引具有相似的值”,您要查找的行现在是相同的

现在你可以做了

[C, ia, ic] = unique(B,'rows','stable');
disp('The answer you want is ');
disp(ia);
您想要的答案将出现在变量
ia
中。看见我不能100%确定您是否可以在同一个调用中使用
稳定
参数,但我认为您可以


试试看它是否管用——如果需要更多信息,可以提问。

这里有一个简单的方法

B = NaN(size(A)); %//Preallocation

for row = 1:size(A,1)
    [~,~,B(row,:)] = unique(A(row,:), 'stable');
end

find(ismember(B(2:end,:), B(1,:), 'rows')) + 1

没有循环的简单解决方案:

row = 1; %// row used as reference
equal = bsxfun(@eq, A, permute(A, [1 3 2]));
equal = reshape(equal,size(A,1),[]); %// linearized signature of each row
result = find(ismember(equal,equal(row,:),'rows')); %// find matching rows
result = setdiff(result,row); %// remove reference row, if needed

关键是计算每行的“签名”,这意味着其元素的所有组合之间的相等关系。这件事就这样结束了。然后,可以很容易地找到具有相同签名的行。

谢谢,Floris。唯一调用没有正确工作,我认为您也打算在其中使用矩阵B。以下是我设法做到的,尽管没有那么干净:

A=[1 0 0 1;
   0 0 1 3;
    0 1 0 1;
    0 1 1 0;
    0 1 2 2;
    3 4 4 3;
    5 9 9 4];

 B = zeros(size(A));

 for ii = 1:size(A,1) 
   r = A(ii,:); 
   B(ii,1) = 1; 
   for jj = 2:size(A,2) 
      c = find(r(1:jj-1)==r(jj)); 
     if numel(c) > 0 
       B(ii,jj) = B(ii,c);
     else
         B(ii,jj) = max(B(ii,:))+1; % need max to generalize to more columns
     end
   end
 end

 match = zeros(size(A,1)-1,size(A,2));
 for i=2:size(A,1)
     for j=1:size(A,2)
         if B(i,j) == B(1,j)
             match(i-1,j)=1;
         end
     end
 end

 index=find(sum(match,2)==size(A,2));
在嵌套循环中,我检查它下面的行中的元素是否在正确的列中匹配。如果存在完全匹配,则行应与行维度相加


当我把它推广到具体的问题时,我正在研究矩阵填充的一组基数(a,2)数。因此,对于base 4及更高版本,else语句中需要max语句来表示不匹配。否则,对于给定行中的某些数字组合,当没有元素时,可能会出现元素的重复。

概述是将每行减少为一个“签名”计数元素重复,即,行1变为1,2。然后检查是否有相同的签名。

update-意思是调用
unique(B,'rows','stable')
-而不是
A
。。。这样更好吗?相关:。对
A
的每一行使用建议的方法。好吧,这或多或少就是我所做的:-)另外,请注意像“1,2”这样的东西作为签名是无效的。例如,当结构不同时,像
1002
1001
这样的行都会给出“1,2,1”签名