逻辑类型 #

一、逻辑类型概述 #

MATLAB的逻辑类型(logical)用于表示真(true)和假(false):

matlab
% 创建逻辑值
a = true;    % 1
b = false;   % 0

% 查看类型
class(a)     % 'logical'

二、创建逻辑值 #

2.1 直接创建 #

matlab
% 使用true/false
a = true;    % 逻辑1
b = false;   % 逻辑0

% 使用logical函数
c = logical(1);   % true
d = logical(0);   % false
e = logical(5);   % true(非零为真)

2.2 比较运算产生 #

matlab
% 比较运算
x = 5;
y = 3;

result1 = x > y;    % true
result2 = x == y;   % false
result3 = x ~= y;   % true

% 数组比较
A = [1 2 3 4 5];
result = A > 3;     % [0 0 0 1 1]

2.3 逻辑数组 #

matlab
% 创建逻辑数组
log_arr = [true, false, true];
log_arr = logical([1 0 1 0 1]);

% 使用函数创建
log_arr = true(3);      % 3x3全true矩阵
log_arr = false(2, 3);  % 2x3全false矩阵

% 条件筛选产生
data = [1 2 3 4 5];
mask = data > 3;        % [0 0 0 1 1]

三、逻辑运算符 #

3.1 元素级运算符 #

运算符 描述 示例
& 与(AND) true & false = false
| 或(OR) true | false = true
~ 非(NOT) ~true = false
xor 异或 xor(true, true) = false
matlab
% 与运算
true & true    % true
true & false   % false
false & false  % false

% 或运算
true | true    % true
true | false   % true
false | false  % false

% 非运算
~true          % false
~false         % true

% 异或运算
xor(true, true)    % false
xor(true, false)   % true
xor(false, false)  % false

% 数组运算
A = [true false true];
B = [true true false];

A & B          % [true false false]
A | B          % [true true true]
~A             % [false true false]

3.2 短路运算符 #

运算符 描述 特点
&& 短路与 第一个为假则不计算第二个
|| 短路或 第一个为真则不计算第二个
matlab
% 短路与
x = 5;
if x > 0 && x < 10
    disp('x在0到10之间');
end

% 短路或
x = -5;
if x < 0 || x > 100
    disp('x不在0到100之间');
end

% 避免错误
x = 0;
if x ~= 0 && 1/x > 0.5    % 使用&&避免除零错误
    disp('条件满足');
end

% 注意:&& 和 || 只能用于标量
% A = [true false];
% A && B    % 错误!

3.3 运算优先级 #

matlab
% 优先级从高到低:
% 1. ~ (非)
% 2. & (与)
% 3. | (或)

% 示例
~true & false     % false(先~后&)
~(true & false)   % true

true | false & false  % true(先&后|)
(true | false) & false  % false

四、逻辑函数 #

4.1 判断函数 #

matlab
% all:所有元素为真
A = [true true true];
all(A)    % true

A = [true false true];
all(A)    % false

% 按维度
A = [true false; true true];
all(A, 1)   % [true false](按列)
all(A, 2)   % [false; true](按行)

% any:任一元素为真
A = [false false true];
any(A)    % true

A = [false false false];
any(A)    % false

4.2 查找函数 #

matlab
% find:查找非零元素索引
A = [1 0 3 0 5];
idx = find(A);       % [1, 3, 5]
idx = find(A > 2);   % [3, 5]

% 查找满足条件的元素
data = [10 20 30 40 50];
idx = find(data > 25);    % [3, 4, 5]
values = data(idx);       % [30 40 50]

% 返回行列索引
A = [1 0 3; 0 5 0];
[row, col] = find(A);
% row = [1; 2; 1]
% col = [1; 2; 3]

4.3 类型判断函数 #

matlab
% islogical:判断是否为逻辑类型
islogical(true)      % true
islogical(1)         % false
islogical(logical(1)) % true

% 其他判断函数返回逻辑值
isnumeric(5)         % true
ischar('hello')      % true
isstring("hello")    % true
isempty([])          % true
isnan(NaN)           % true
isinf(Inf)           % true
isfinite(5)          % true

五、逻辑索引 #

5.1 基本用法 #

matlab
% 使用逻辑数组索引
data = [10 20 30 40 50];
mask = [true false true false true];
selected = data(mask);    % [10 30 50]

% 使用条件表达式
selected = data(data > 25);  % [30 40 50]

% 修改满足条件的元素
data(data > 25) = 0;
% data = [10 20 0 0 0]

5.2 多条件索引 #

matlab
data = [10 20 30 40 50 60];

% 与条件
selected = data(data > 20 & data < 50);  % [30 40]

% 或条件
selected = data(data < 20 | data > 50);  % [10 60]

% 排除条件
selected = data(~(data > 30));  % [10 20 30]

5.3 矩阵逻辑索引 #

matlab
% 二维矩阵
A = [1 2 3; 4 5 6; 7 8 9];

% 提取大于5的元素
values = A(A > 5);  % [6 7 8 9]

% 将偶数置零
A(mod(A, 2) == 0) = 0;
% A = [1 0 3; 0 5 0; 7 0 9]

% 提取对角线元素
n = size(A, 1);
diag_mask = logical(eye(n));
diag_vals = A(diag_mask);

六、逻辑值与数值转换 #

6.1 逻辑值转数值 #

matlab
% 自动转换
log_val = true;
num = log_val + 0;    % 1
num = double(log_val); % 1

% 在计算中自动转换
true + true    % 2
true * 5       % 5

% 统计真值个数
mask = [true false true true];
count = sum(mask);    % 3

6.2 数值转逻辑值 #

matlab
% logical函数
logical(1)     % true
logical(0)     % false
logical(5)     % true(非零为真)
logical(-1)    % true

% 数组转换
nums = [1 0 3 0 5];
log_arr = logical(nums);  % [true false true false true]

% 注意:NaN转逻辑会报错
% logical(NaN)  % 错误

七、实用示例 #

7.1 数据筛选 #

matlab
% 筛选有效数据
data = [1.2, NaN, 3.4, NaN, 5.6];
valid_data = data(~isnan(data));  % [1.2 3.4 5.6]

% 筛选满足多个条件的数据
scores = [85 92 78 95 60 88];
mask = scores >= 80 & scores <= 90;
good_scores = scores(mask);  % [85 88]

7.2 条件统计 #

matlab
% 统计满足条件的元素个数
data = [1 2 3 4 5 6 7 8 9 10];

% 大于5的个数
count = sum(data > 5);  % 5

% 偶数个数
count = sum(mod(data, 2) == 0);  % 5

% 在范围内的个数
count = sum(data >= 3 & data <= 7);  % 5

7.3 数据替换 #

matlab
% 替换异常值
data = [1 2 100 4 5 200 7];
data(data > 50) = NaN;  % [1 2 NaN 4 5 NaN 7]

% 替换特定值
data = [1 0 3 0 5];
data(data == 0) = -1;   % [1 -1 3 -1 5]

% 条件替换
data = [1 2 3 4 5];
data(data < 3) = 0;     % [0 0 3 4 5]

7.4 查找极值 #

matlab
% 找到最大值位置
data = [3 7 2 9 5];
[max_val, max_idx] = max(data);
% max_val = 9, max_idx = 4

% 找到所有局部最大值
data = [1 3 2 4 1 5 2];
peaks = (data(2:end-1) > data(1:end-2)) & ...
        (data(2:end-1) > data(3:end));
peak_indices = find(peaks) + 1;  % [2, 4, 6]

八、常见错误 #

8.1 运算符混淆 #

matlab
% 错误:使用位运算符
% if a & b    % 对于标量可以,但效率低

% 正确:使用短路运算符
if a && b    % 推荐用于标量条件

% 错误:对数组使用短路运算符
A = [true false];
% if A && B   % 错误!

% 正确:使用元素运算符
if all(A)    % 检查所有元素

8.2 类型混淆 #

matlab
% 注意:logical(1) 不等于 1
a = true;
b = 1;

a == b        % true(值相等)
islogical(a)  % true
islogical(b)  % false

% 在某些函数中行为不同
find([1 0 1])        % [1, 3]
find(logical([1 0 1])) % [1, 3](相同)

8.3 空数组处理 #

matlab
% 空逻辑数组
empty = logical([]);

% all和any对空数组的处理
all([])   % true(空数组所有元素满足条件)
any([])   % false(空数组没有元素满足条件)

九、最佳实践 #

9.1 使用逻辑索引代替循环 #

matlab
% 不推荐:使用循环
data = rand(1000, 1);
result = [];
for i = 1:length(data)
    if data(i) > 0.5
        result = [result; data(i)];
    end
end

% 推荐:使用逻辑索引
result = data(data > 0.5);

9.2 使用短路运算符 #

matlab
% 推荐:使用短路运算符避免不必要的计算
if ~isempty(x) && x(1) > 0
    % 安全访问x(1)
end

% 不推荐
if ~isempty(x) & x(1) > 0  % 可能出错
end

9.3 清晰的条件表达式 #

matlab
% 推荐:使用有意义的变量名
is_valid = x > 0 & x < 100;
is_complete = status == 'done';

if is_valid & is_complete
    process_data();
end

% 不推荐:复杂的内联条件
if x > 0 & x < 100 & status == 'done'
    process_data();
end

十、总结 #

本章学习了:

  1. 逻辑类型创建:true/false、logical函数
  2. 逻辑运算符:&、|、~、&&、||、xor
  3. 逻辑函数:all、any、find
  4. 逻辑索引:条件筛选和修改
  5. 类型转换:逻辑值与数值互转
  6. 实用技巧:数据筛选、条件统计、数据替换

下一章将学习MATLAB的结构体类型。

最后更新:2026-03-27