搜索一个矩阵并删除除第一个矩阵外相互转置的向量(Matlab)
在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
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