我正在比较两个二进制数组。我有一个数组,其中值可以是1或0,如果值相同则为1,如果不相等则为0。请注意我正在做除检查之外的其他事情,因此我们不需要进入矢量化或代码的性质。
在MATLAB中使用数值数组或逻辑数组更有效吗?
答案 0 :(得分:5)
Logical值比大多数numeric值占用更少的字节,如果您处理非常大的数组,这是一个加号。您还可以使用逻辑数组执行logical indexing。例如:
>> valArray = 1:5; %# Array of values
>> numIndex = [0 1 1 0 1]; %# Numeric array of ones and zeroes
>> binIndex = logical([0 1 1 0 1]); %# Logical array of ones and zeroes
>> whos
Name Size Bytes Class Attributes
binIndex 1x5 5 logical %# 1/8 the number of bytes
numIndex 1x5 40 double %# as a double array
valArray 1x5 40 double
>> b = valArray(binIndex) %# Logical indexing
b =
2 3 5
>> b = valArray(find(numIndex)) %# You have to use the FIND function to
%# find the indices of the non-zero
b = %# values in numIndex
2 3 5
一个注意事项:如果您要处理的是零数组和非常稀疏的数组(即很少的数组),最好使用数组索引,例如从FIND函数获取。请参考以下示例:
>> binIndex = false(1,10000); %# A 1-by-10000 logical array
>> binIndex([2 100 1003]) = true; %# Set 3 values to true
>> numIndex = find(binIndex) %# Find the indices of the non-zero values
numIndex =
2 100 1003
>> whos
Name Size Bytes Class Attributes
binIndex 1x10000 10000 logical %# 10000 bytes versus
numIndex 1x3 24 double %# many fewer bytes
%# for a shorter array
答案 1 :(得分:1)
逻辑当然! Matlab可以选择将8个项目压缩成1个字节。 (无论是否是另一回事)。
a=ones(1000); b=(a==1);
tic;for(k=1:100)for(i=1:1000);for(j=1:1000);a(i,j)=a(i,j);end;end;end;toc
tic;for(k=1:100)for(i=1:1000);for(j=1:1000);b(i,j)=b(i,j);end;end;end;toc
结果
4.561173 seconds
3.454697 seconds
但如果你做更多的逻辑操作而不仅仅是循环,那么好处会更大!