Cam*_*Cam 5 matlab language-features matrix built-in
在matlab中,如果你有一个矩阵,A你可以找到B包含所有唯一行的矩阵A,如下所示:
B = unique(A,'rows');
Run Code Online (Sandbox Code Playgroud)
我所拥有的是一个3d矩阵,其中行和列作为前两个维度,另外一个维度('切片').
如何获得包含矩阵中所有唯一切片的3d矩阵A?这是我想要的功能的一个例子:
>> A % print out A
A(:,:,1) =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
A(:,:,2) =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
A(:,:,3) =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
A(:,:,4) =
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
>> unique(A,'slices'); % get unique slices
A(:,:,1) =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
A(:,:,2) =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
A(:,:,3) =
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
Run Code Online (Sandbox Code Playgroud)
我将首先重塑A,以便每个切片成为一行(使用reshape命令).然后用unique(A, 'rows').最后,将唯一的行重新整形为切片的相同形状.
例如:
% transforming so each row is a slice in row form
reshaped_A = reshape(A, [], size(A, 3))';
% getting unique rows
unique_rows = unique(reshaped_A, 'rows');
% reshaping back
unique_slices = reshape(unique_rows', size(A, 1), size(A, 2), []);
Run Code Online (Sandbox Code Playgroud)
或者全部在一行:
reshape(unique(reshape(A, [], size(A, 3))', 'rows')', size(A, 1), size(A, 2), [])
Run Code Online (Sandbox Code Playgroud)
我没有检查上面的代码所以请谨慎使用!但它应该提出这个想法.
编辑
这里它正在处理你的数据(也修复了上面代码中的小错误):
>> reshaped_A = reshape(A, [], size(A, 3))'
reshaped_A =
Columns 1 through 11
16 5 9 4 2 11 7 14 3 10 6
1 0 0 0 0 1 0 0 0 0 1
16 5 9 4 2 11 7 14 3 10 6
0 0 0 1 0 0 1 0 0 1 0
Columns 12 through 16
15 13 8 12 1
0 0 0 0 1
15 13 8 12 1
0 1 0 0 0
Run Code Online (Sandbox Code Playgroud)
这些^^行中的每一行都是原始切片之一
>> unique_rows = unique(reshaped_A, 'rows')
unique_rows =
Columns 1 through 11
0 0 0 1 0 0 1 0 0 1 0
1 0 0 0 0 1 0 0 0 0 1
16 5 9 4 2 11 7 14 3 10 6
Columns 12 through 16
0 1 0 0 0
0 0 0 0 1
15 13 8 12 1
Run Code Online (Sandbox Code Playgroud)
这些^^是唯一的切片,但形状错误.
>> unique_slices = reshape(unique_rows', size(A, 1), size(A, 2), [])
unique_slices(:,:,1) =
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0
unique_slices(:,:,2) =
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
unique_slices(:,:,3) =
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
Run Code Online (Sandbox Code Playgroud)