Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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,在Matlab中 以下是一个较大矩阵的示例: 5 11 9 12 5 11 12 9 5 9 11 12 5 9 12 11 5 12 9 11 5 12 11 9 12 11 9 7 12 11 7 9 12 9 11 7 12 9 7 11 12 7 9

在Matlab中

以下是一个较大矩阵的示例:

 5    11     9    12
 5    11    12     9
 5     9    11    12
 5     9    12    11
 5    12     9    11
 5    12    11     9
12    11     9     7
12    11     7     9
12     9    11     7
12     9     7    11
12     7     9    11
12     7    11     9
11    12     9     7
11    12     7     9
11     9    12     7
11     9     7    12
11     7     9    12
11     7    12     9
 9    11    12     7
 9    11     7    12
 9    12    11     7
 9    12     7    11
 9     7    12    11
 9     7    11    12
 7    11     9    12
 7    11    12     9
 7     9    11    12
 7     9    12    11
 7    12     9    11
 7    12    11     9
我想要一些代码,看看这个矩阵,找到所有相互转置的向量,例如

7    12     9    11
7    12     9    11

并创建一个新矩阵,该矩阵仅包含每个转置向量的一个版本,在其原始矩阵上可用的最低转置中(即,如果原始矩阵包含:

那我就只想留下

6    11     8    10

(类似地,我希望列表保留没有换位的任何向量)

假设
A
作为输入数组,这里有一种循环方法-

out = [];
A_cut = A;
while size(A_cut,1)~=0
    grp_mask = all(diff(bsxfun(@minus,A_cut,A_cut(1,:)),[],2)==0,2)
    grpIDs = find(grp_mask)
    [~,min_idx] = min(A_cut(grpIDs,1))
    out_add = A_cut(grpIDs(min_idx),:)
    out = [out ; out_add];
    A_cut = A_cut(~grp_mask,:)
end
样本输入、输出-

A =
     9     9     3     2
     5    10     7     9
     5    11     9    12
     6    11     8    10
    12    11     9     7
     7    12     9    11
     8     8     2     1
out =
     8     8     2     1 %// replaces (8,8,2,1) & (9,9,3,2)
     5    10     7     9 %// replaces (5,10,7,9),(6,11,8,10) & (7,12,9,11)
     5    11     9    12
    12    11     9     7

你能详细解释一下你所说的相互转置的向量是什么意思吗?同意。不清楚这两个示例向量之间的隐含关系。对不起,第二个数字比第一个数字小一个整数。我将描述为转置的另一个向量是:9 14 11 13-我应该怎么做描述过这个吗?从
N=bsxfun(@减号,M(:,1),M)
开始,得到一个矩阵,其中你称之为转置的行相等,然后使用
unique
来识别相互转置的行
[~,~,index]=unique(N,'rows')
谢谢-我正在努力使…[~,~,index]=unique(N,'rows'))…舞台工作…你能不能再做一点傻事证明?我现在所做的就是复制并粘贴那行-我应该改变它的一部分吗(为一般的愚蠢道歉…)嗨-谢谢你!我不相信它是有效的(但我可能会变得很密集)-这是我在插入位时使用的代码:
clear clc v=[0 2 4 5 7 9 11 12];n=4;allset=nchoosek(v,n);output=arrayfun(@(x)perms(allset(x,:)),1:size(allset,1),'Uni',0)A=vertcat(output{:})out=[];A_cut A;而size(A_cut 1)~=0 grp_mask=all(diff(bsxfun,A_cut,A,[])=0,2)grpIDs=find(grp_mask)[~,min_idx]=min(A_cut(grpIDs,1))out_add=A_cut(grpIDs(min_idx),:)out=[out;out_add];A_cut=A_cut(~grp_mask,:)结束
你怎么看?嘿@SamLeak!那么,输出中是否有一行错误的输入样本输出?事实上,在检查时,我的问题是代码的另一部分-很抱歉!因此@divakar你的答案实际上工作得很好-谢谢!你知道我怎么做吗,按照这个,然后从每个值中减去,我在给定的行中,该行第一列中的值(每行以值0开头)?例如,对于
[8 8 2 1]
您将从每个值中减去8,成为
[0 0-6-7]
,并且
[5 10 7 9]
您将从每个值中减去5,成为
[0 5 2 4]
?再次感谢!@divikar-在朋友的帮助下,这似乎应该可以做到:
从零开始=输出repmat(输出(:,1),1,大小(输出,2))
out = [];
A_cut = A;
while size(A_cut,1)~=0
    grp_mask = all(diff(bsxfun(@minus,A_cut,A_cut(1,:)),[],2)==0,2)
    grpIDs = find(grp_mask)
    [~,min_idx] = min(A_cut(grpIDs,1))
    out_add = A_cut(grpIDs(min_idx),:)
    out = [out ; out_add];
    A_cut = A_cut(~grp_mask,:)
end
A =
     9     9     3     2
     5    10     7     9
     5    11     9    12
     6    11     8    10
    12    11     9     7
     7    12     9    11
     8     8     2     1
out =
     8     8     2     1 %// replaces (8,8,2,1) & (9,9,3,2)
     5    10     7     9 %// replaces (5,10,7,9),(6,11,8,10) & (7,12,9,11)
     5    11     9    12
    12    11     9     7