在matlab中比较3D阵列中的矢量最快的方法是什么



这是我的示例数据。

Ycoordinate = 10; 
Xcoordinate = 12; 
Zdata = 4; 
my3Darray = zeros(Ycoordinate, Xcoordinate, Zdata);
for i = 1:Ycoordinate
for j = 1:Xcoordinate
my3Darray(i,j,:) = uint8(rand(Zdata,1)*64);
end
end
my3Darray = uint8(my3Darray);

如您所见,共有120个位置(Y:10*X:12(,每个位置都有4个uint8值。

以下是我的问题。

  1. 我想知道是否有任何两个或更多的位置具有相同的Zdata向量(uint8值的4(。我该怎么做?

  2. 我的实际数据将是Ycoordinate=7000Xcoordinate=7000Zdata = 500。因此,它将是大约24GB的阵列(7000*7000*500=24500000000字节(有可能用这么大的数组找到相同的Zdata吗?

此外,我的数据实际上是boolean,所以它只是01,但我不知道如何只为我的数据分配"1位(而不是1字节("。

下面的代码将告诉您有多少位置具有重复的z数据向量。其想法是将数据reshape转换为2D矩阵,其中每行表示原始矩阵中的一列z数据。重新整形的矩阵将具有Xcoordinate*Ycoordinate行和Zdata列。然后,您可以使用unique函数来获得这个重新整形矩阵的唯一行,它基本上删除了任何重复的z数据向量。

您也可以用以下行替换代码中的嵌套循环,以直接生成3D随机矩阵:

my3Darray = uint8(rand(Ycoordinate, Xcoordinate, Zdata)*64);

如果要存储布尔数据,请在MATLAB中使用logical数组

编辑:按照烧杯上面的注释来减少内存占用。

这是代码:

clear
clc
Ycoordinate = 4000;
Xcoordinate = 4000;
Zdata = 63;
my3Darray = uint8(rand(Ycoordinate,Xcoordinate,Zdata)*64);
%reshape data so that each z-column becomes a row
A = reshape(my3Darray,Ycoordinate*Xcoordinate,Zdata);
[A_unique, I, J] = unique(A,'rows'); %get the unique rows of A
duplicate_count = size(A,1) - size(A_unique,1)

相关内容

最新更新