这是我的示例数据。
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值。
这是我的问题。
我想查找是否有两个或两个以上位置具有相同的Zdata向量(uint8值中的4个)。我该怎么办?
我的实际数据将是Ycoordinate=7000
,Xcoordinate=7000
,Zdata = 500
。
因此它将约为24GB阵列(7000 * 7000 * 500 = 24,500,000,000字节)
如此庞大的数组可以找到相同的Zdata吗?
此外,我的数据实际上是boolean
,所以它只是0
或1
,但我不知道如何为我只分配“ 1位(不是1个字节)”数据。
答案 0 :(得分: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)