我使用的是 Matlab 符号。我有一个大小为 (Nx3) 的矩阵 A,其中 A 的每个条目都是正整数。我想创建一个维度为 (max(max(A))x2) 的矩阵 Q。Q 的第 i 行对应于 A 的列索引,因此 A(k,r) = i。因此,如果 A(k_1,r_1) = i 且 A(k_2,r_2) = i,我们可以设置 Q(i,:)=[k_1,k_2]。对于 A 的唯一条目,Q 的相关行的每一列都相等。
有没有办法将任务矢量化?我可以使用循环执行任务,但在 MATLAB 中效率很低(当矩阵 A 有很大的行并且 max(max(A)) 也很大时)。这是一个例子。
A=[ 1 10 9
1 2 4
3 2 11
3 12 5
6 13 4
6 7 15
8 7 5
8 14 16]
在上面的例子中,预期结果是
Q =
1 1
2 2
1 1
3 3
3 3
1 1
2 2
1 1
3 3
2 2
3 3
2 2
2 2
2 2
3 3
3 3
这就是我的慢速代码所做的
max_Q = max(max(A));
Q = zeros(max_Q,2);
for i = 1 : max_Q
[~,cols] = find(i == A);
Q(i,:) = cols;
end
您可以使用返回的线性索引
unique
来提供每个唯一整数的列号。由于整数默认按排序顺序给出,因此索引列表(转换为列号)给出了输出的一列。鉴于:
找到每个整数第一次出现的索引:
(请注意,如果我们不能保证每个整数至少出现一次,我们可以将其用作
Y
结果数组的行索引。)然后可以使用以下方法将线性索引转换为(行和)列号
ind2sub
:如果保证整数的两次出现都在同一列,我们就完成了:
如果整数出现在不同的列中,我们只需使用
unique
第二次: