条件语句/循环语句simulink的实现方法(二)

电子说

1.3w人已加入

描述

For 循环

for 循环是 Python 中用于遍历序列(如列表、元组、字符串等)的迭代结构。for 循环的本质是按照序列中的元素顺序执行代码块,并在每次迭代中获取序列的下一个元素。for 循环的语法结构如下:

for variable in sequence:
    # 代码块

下面是一个使用 for 循环的简单示例,以及相应的代码注释:

# 创建一个数字列表
numbers = [1, 2, 3, 4, 5]

# 使用 for 循环遍历列表中的每个元素
for num in numbers:
    # 在每次迭代中,将当前元素乘以 2 并打印
    double_num = num * 2
    print(double_num)

# 输出结果:
# 2
# 4
# 6
# 8
# 10

此外,你还可以使用 range() 函数与 for 循环配合使用,实现特定范围内的迭代。下面是一个例子:

# 使用 range() 函数生成一个包含 0 到 4(不包括 5)的整数序列
# 并使用 for 循环遍历这个序列
for i in range(5):
    # 在每次迭代中,将当前索引值乘以 3 并打印
    triple_i = i * 3
    print(triple_i)

# 输出结果:
# 0
# 3
# 6
# 9
# 12

通过这些示例,你可以看到 for 循环如何在 Python 代码中实现对序列的遍历,以及如何利用循环执行特定任务。

当然Python 中的 for 循环还可以与其他高级功能结合使用,实现更强大的功能。以下是一些高级用法的示例:

列表推导式(List Comprehensions)

列表推导式是一种简洁的创建列表的方法,它使用 for 循环实现。例如,我们可以使用列表推导式创建一个包含平方数的列表:

# 使用列表推导式创建一个包含 1 到 10 的平方数的列表
squares = [x**2 for x in range(1, 11)]
print(squares)
# 输出结果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

带有条件的列表推导式

列表推导式可以与条件语句结合,根据特定条件过滤或更改结果。例如,我们可以创建一个仅包含偶数平方数的列表:

# 使用带有条件的列表推导式创建一个仅包含 1 到 10 的偶数平方数的列表
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(even_squares)
# 输出结果:[4, 16, 36, 64, 100]

使用 enumerate() 函数

enumerate() 函数允许你在 for 循环中同时获取元素及其索引。例如:

# 创建一个字符串列表
fruits = ["apple", "banana", "cherry"]

# 使用 enumerate() 函数遍历列表,并同时获取元素及其索引
for index, fruit in enumerate(fruits):
    print(f"{index}: {fruit}")

# 输出结果:
# 0: apple
# 1: banana
# 2: cherry

使用 zip() 函数

zip() 函数允许你在 for 循环中同时遍历多个序列。例如:

# 创建两个数字列表
list1 = [1, 2, 3]
list2 = [4, 5, 6]

# 使用 zip() 函数同时遍历两个列表,并将对应的元素相加
for a, b in zip(list1, list2):
    print(a + b)

# 输出结果:
# 5
# 7
# 9

这些高级用法展示了 for 循环在 Python 中的灵活性和实用性。你可以将这些技巧应用到更复杂的问题中,实现高效且简洁的代码。

举例说明

如今许多纯电车型都已经配备了DMS或者OMS视觉识别系统,那么就可以考虑将家庭用车成员人脸及身份信息录入系统数据库(字典),并通过大屏进行不同环境条件下需求的热舒适系统组合设置,与对应的身份信息形成关联,这样,当家庭成员上车后,即可通过视觉识别系统自动识别人员身份,在数据库中已存储的多个信息中进行查询,当识别的人脸信息与某个已存储信息一致时,则进入该存储信息下的热舒适模式库(字典),通过环境信息传感器采集的环境条件,调取热舒适模式库中与之对应的唯一匹配的热舒适模式,更近一步的话,可以加入自主学习功能,学习用户习惯,修改对应推送权重,不断的优化热舒适模式库中的定义信息。

接下来,我们会用到编程语言中的数据结构: 字典 ,一种采用键值对的结构类型,形如:{key1:value1,key2:value2,…}

在编程中,字典是一种非常有用的数据结构,它可以存储键值对,并且支持快速查找和修改。在Python中,我们可以使用大括号{}来创建一个字典对象。

以下是一些常见的字典操作:

创建字典

# 创建空字典
my_dict = {}

# 创建带有初始键值对的字典
my_dict = {'apple': 2, 'banana': 3, 'orange': 4}

访问字典元素

# 使用键访问值
print(my_dict['apple']) # 输出 2

# 使用get()方法访问值(如果键不存在,则返回None或指定的默认值)
print(my_dict.get('pear')) # 输出 None
print(my_dict.get('pear', 0)) # 输出 0

修改字典元素

# 直接赋值修改值
my_dict['apple'] = 5

# 使用update()方法批量修改值
my_dict.update({'banana': 6, 'pear': 7})

遍历字典

# 遍历所有键
for key in my_dict:
    print(key)

# 遍历所有值
for value in my_dict.values():
    print(value)

# 遍历所有键值对
for key, value in my_dict.items():
    print(key, value)

删除字典元素

# 根据键删除键值对
del my_dict['apple']

# 清空字典
my_dict.clear()

需要注意的是,字典中的键必须是不可变类型(如字符串、数字或元组),而值可以是任意类型。此外,字典是无序的,即它们的元素没有固定的顺序。

在Python中,我们可以使用字典来嵌套其他的数据结构,包括另一个字典。这种方式通常被称为“字典嵌套”。

以下是一个示例代码,展示了如何在字典中嵌套另一个字典:

# 定义一个嵌套字典
my_dict = {
    'apple': {'price': 2, 'color': 'red'},
    'banana': {'price': 3, 'color': 'yellow'},
    'orange': {'price': 4, 'color': 'orange'}
}

# 访问嵌套字典中的元素
print(my_dict['apple']['price']) # 输出 2
print(my_dict['banana']['color']) # 输出 yellow

# 修改嵌套字典中的元素
my_dict['orange']['price'] = 5
print(my_dict['orange']['price']) # 输出 5

需要注意的是,在访问或修改嵌套字典中的元素时,我们需要使用多个键来指定路径。例如,my_dict['apple']['price']表示访问'apple'键对应的值(即另一个字典),然后再访问该字典中'price'键对应的值。

此外,我们还可以通过循环遍历嵌套字典中的所有元素,例如:

for key1 in my_dict:
    for key2 in my_dict[key1]:
        print(key1, key2, my_dict[key1][key2])

这段代码会依次输出每个键值对的键和值,其中key1表示外层字典中的键,key2表示内层字典中的键。

中间穿插了这么多的关于字典数据结构的信息,主要还是因为上面的举例说明用python实现需要用到这方面的知识,闲话休提,我们再次回到正题

我们通过嵌套字典的数据结构存储身份ID(key1):Identity_ID、环境条件(key2):Environmental_conditions、热舒适模式(value):Comfort_mode

即Intelligent_Comfort_Mode={key1:{key2:value}}={Identity_ID:{Environmental_conditions:Comfort_mode}}

假设家庭成员有lin_baba、lin_meimei、wang_mama,其中lin_baba自定义了四个依据环境条件自动推送的热舒适模式

那么最终的Intelligent_Comfort_Mode={lin_baba:{Environmental_conditions1:Comfort_mode1,Environmental_conditions2:Comfort_mode2,Environmental_conditions3:Comfort_mode3,Environmental_conditions4:Comfort_mode4},wang_mama:{…},lin_meimei:{…}}

Intelligent_Comfort_Mode数据存储结构建立好以后,就可以通过人脸图像扫描信息、环境条件采集信息遍历字典查询与之对应的热舒适模式Comfort_mode了

Python代码实现

def add_member(family_members, identity_id):
    # 如果家庭成员字典中不存在该成员,就添加一个新的成员,并初始化其环境条件字典
    if identity_id not in family_members:
        family_members[identity_id] = {}

def add_environment_condition(family_members, identity_id, environmental_condition, comfort_mode):
    # 如果家庭成员存在,向该成员的环境条件字典中添加一条新的环境条件和对应的热舒适模式
    if identity_id in family_members:
        family_members[identity_id][environmental_condition] = comfort_mode

def update_comfort_mode(family_members, identity_id, environmental_condition, new_comfort_mode):
    # 如果家庭成员和对应的环境条件存在,更新该环境条件的热舒适模式
    if identity_id in family_members:
        if environmental_condition in family_members[identity_id]:
            family_members[identity_id][environmental_condition] = new_comfort_mode

def get_comfort_mode(family_members, identity_id, environmental_condition):
    # 如果家庭成员和对应的环境条件存在,返回该环境条件的热舒适模式
    if identity_id in family_members:
        if environmental_condition in family_members[identity_id]:
            return family_members[identity_id][environmental_condition]
    return None

def learn_from_user_behavior(family_members, identity_id, environmental_condition, comfort_mode):
    # 根据用户行为、时间等权重以自定义方式更新热舒适模式信息
    pass

# 初始化家庭成员字典
family_members = {}

# 添加家庭成员
add_member(family_members, "lin_baba")
add_member(family_members, "lin_meimei")
add_member(family_members, "wang_mama")

# 添加环境条件和对应的热舒适模式
add_environment_condition(family_members, "lin_baba", "Environmental_conditions1", "Comfort_mode1")
add_environment_condition(family_members, "lin_baba", "Environmental_conditions2", "Comfort_mode2")
add_environment_condition(family_members, "lin_baba", "Environmental_conditions3", "Comfort_mode3")
add_environment_condition(family_members, "lin_baba", "Environmental_conditions4", "Comfort_mode4")

# 根据人脸识别结果和环境条件获取对应的热舒适模式
identity_id = "lin_baba"
environmental_condition = "Environmental_conditions1"
comfort_mode = get_comfort_mode(family_members, identity_id, environmental_condition)
print(f"{identity_id} in {environmental_condition}: {comfort_mode}")

# 更新热舒适模式
new_comfort_mode = "New_Comfort_mode1"
update_comfort_mode(family_members, identity_id, environmental_condition, new_comfort_mode)
comfort_mode = get_comfort_mode(family_members, identity_id, environmental_condition)
print(f"{identity_id} in {environmental_condition}: {comfort_mode}")

# 学习用户行为
learn_from_user_behavior(family_members, identity_id, environmental_condition, comfort_mode)

# 打印家庭成员的所有环境条件和热舒适模式
def print_family_members_info(family_members):
    for identity_id, environmental_conditions in family_members.items():
        print(f"{identity_id}:")
        for condition, comfort_mode in environmental_conditions.items():
            print(f"  {condition}: {comfort_mode}")
        print()

matlab function代码实现

% 添加家庭成员
function family_members = add_member(family_members, identity_id)
    if isKey(family_members, identity_id)
        family_members(identity_id) = containers.Map();
    end
end

% 添加环境条件和对应的热舒适模式
function family_members = add_environment_condition(family_members, identity_id, environmental_condition, comfort_mode)
    if isKey(family_members, identity_id)
        family_members(identity_id)(environmental_condition) = comfort_mode;
    end
end

% 更新热舒适模式
function family_members = update_comfort_mode(family_members, identity_id, environmental_condition, new_comfort_mode)
    if isKey(family_members, identity_id) && isKey(family_members(identity_id), environmental_condition)
        family_members(identity_id)(environmental_condition) = new_comfort_mode;
    end
end

% 获取热舒适模式
function comfort_mode = get_comfort_mode(family_members, identity_id, environmental_condition)
    comfort_mode = [];
    if isKey(family_members, identity_id) && isKey(family_members(identity_id), environmental_condition)
        comfort_mode = family_members(identity_id)(environmental_condition);
    end
end

% 学习用户行为
function family_members = learn_from_user_behavior(family_members, identity_id, environmental_condition, comfort_mode)
    % 根据用户行为、时间等权重以自定义方式更新热舒适模式信息
end

% 初始化家庭成员字典
family_members = containers.Map();

% 添加家庭成员
family_members = add_member(family_members, 'lin_baba');
family_members = add_member(family_members, 'lin_meimei');
family_members = add_member(family_members, 'wang_mama');

% 添加环境条件和对应的热舒适模式
family_members = add_environment_condition(family_members, 'lin_baba', 'Environmental_conditions1', 'Comfort_mode1');
family_members = add_environment_condition(family_members, 'lin_baba', 'Environmental_conditions2', 'Comfort_mode2');
family_members = add_environment_condition(family_members, 'lin_baba', 'Environmental_conditions3', 'Comfort_mode3');
family_members = add_environment_condition(family_members, 'lin_baba', 'Environmental_conditions4', 'Comfort_mode4');

% 根据人脸识别结果和环境条件获取对应的热舒适模式
identity_id = 'lin_baba';
environmental_condition = 'Environmental_conditions1';
comfort_mode = get_comfort_mode(family_members, identity_id, environmental_condition);
fprintf('%s in %s: %sn', identity_id, environmental_condition, comfort_mode);

% 更新热舒适模式
new_comfort_mode = 'New_Comfort_mode1';
family_members = update_comfort_mode(family_members, identity_id, environmental_condition, new_comfort_mode);
comfort_mode = get_comfort_mode(family_members, identity_id, environmental_condition);
fprintf('%s in %s: %sn', identity_id, environmental_condition, comfort_mode);

% 学习用户行为
family_members = learn_from_user_behavior(family_members, identity_id, environmental_condition, comfort_mode)

由于上面举例实现起来有点复杂,不利于理解,我们简化以下控制需求,只保留一层字典{key,value}={identity_id,comfort_mode}

重新生成matlab function代码

function y = get_comfort_mode(identity_id, comfort_mode)
% identity_id: 人员信息
% comfort_mode: 舒适模式

% 初始化输出值为NaN
y = NaN;

% 遍历字典中的所有键值对
keys = fieldnames(comfort_mode);
for i = 1:length(keys)
    key = keys{i};
    if strcmp(key, identity_id) % 如果找到了指定的人员
        y = comfort_mode.(key); % 输出该人员对应的舒适模式
        break;
    end
end

在上述代码中,identity_id表示人员信息,comfort_mode表示舒适模式。首先,我们将输出值初始化为NaN,以便在未找到指定键时返回一个无效值。然后,我们使用fieldnames()函数获取字典中的所有键,并通过循环逐个检查每个键是否与指定键匹配。如果找到了指定键,则将输出值设置为该键对应的值,并跳出循环。

考虑到本块目的是在simulink中实现For循环,我们选用一个最简单的例子,x遍历(1:10),y1=power(x, 2)+y1

matlab function代码实现

function y1=fac()
y1=0;

for x=1:10
    y1=power(x, 2)+y1;
end

simulink实现

simulink仿真

simulink仿真

simulink仿真

For Iterator 模块就充当了 for(i = 0,i<10,i++)的角色,并把i 输出出来。

在很多带索引的模块里,都会有索引模式的选项,模型里的索引语法是从0开始还是从1开始。从建模规范上来说,不管Zero-based 还是 One-based,全篇统一就行,防止出错。但是在 MATLAB Function 里,似乎是只能从1开始的。

simulink仿真

While循环

While循环是一种常见的程序控制结构,它可以在满足特定条件时重复执行一段代码块。其本质是一个条件语句,只有当指定的条件为真时才会执行循环体中的代码。

While循环通常用于需要反复执行某个操作直到达成特定条件的情况下。例如,在计算机编程中,我们可能需要对一组数据进行处理,直到所有数据都被处理完毕为止。这时候就可以使用While循环来实现。

While循环的基本语法如下:

while (condition)
{
    // 循环体
}

其中,condition是一个布尔表达式,如果该表达式的值为true,则继续执行循环体中的代码;否则跳出循环。

在每次迭代中,程序首先检查condition是否为true。如果是,则执行循环体中的代码,并再次检查condition的值。如果仍然为true,则继续执行循环体中的代码,以此类推。如果condition的值变为false,则跳出循环,继续执行后面的代码。

我们接着用上面的例子:x遍历(1:10),y1=power(x, 2)+y1

Python代码实现

# 计算1到10之间所有整数平方和
y1 = 0
x = 1

while x <= 10:
    y1 += power(x,2)
    x += 1

print("1到10之间所有整数平方和为:", y1)

matlab function实现

function y1 = fcn(x)
%#codegen

y1 = 0;
x = 1;

while i <= 10
    y1 = power(x,2)+y1;
    x = x + 1;
end

simulink实现

simulink仿真

simulink仿真

simulink仿真

  • Maximum number of iterations是指最大迭代次数,这里设为-1表示没有最大迭代次数,while循环的中止条件由外部决定而不由迭代次数决定
  • While loop type是指循环类型,这里选择while循环。其他情况下也可以选择
  • do-while States when starting选为reset,表示每一个时间步都会重置
  • Show iteration number port表示迭代次数,勾选上,后面建模会用到这个迭代次数

stateflow同For循环一致,不再赘述

Do-while循环

while循环和do-while循环是两种常见的循环结构,它们的主要区别在于循环条件的判断时机不同。

while循环先判断循环条件是否满足,如果满足则执行循环体中的语句,然后再次判断循环条件是否满足。如果循环条件仍然满足,则继续执行循环体中的语句,直到循环条件不满足为止。因此,在使用while循环时,如果循环条件一开始就不满足,那么循环体中的语句将不会被执行。

例如,下面的代码演示了一个简单的while循环:

i = 0

while i < 5:
    print(i)
    i += 1

这个循环将打印出从0到4的整数,因为当i=5时,循环条件i<5不再满足,循环结束。

而do-while循环则先执行一次循环体中的语句,然后再判断循环条件是否满足。如果循环条件满足,则继续执行循环体中的语句,否则跳出循环。因此,在使用do-while循环时,无论循环条件是否满足,循环体中的语句至少会被执行一次。

例如,下面的代码演示了一个简单的do-while循环:

i = 0

do:
    print(i)
    i += 1
while i < 5

这个循环将打印出从0到4的整数,因为在第一次执行循环体时,i=0,循环条件i<5满足,所以循环体中的语句被执行。然后,在接下来的四次循环中,循环条件仍然满足,因此循环体中的语句继续被执行,直到i=5时,循环条件不再满足,循环结束。

总之,while循环和do-while循环都是常见的循环结构,它们的区别在于循环条件的判断时机不同。在使用时需要根据具体情况选择合适的循环结构。

我们接着用上面的例子:x遍历(1:10),y1=power(x, 2)+y1

Python代码实现

# 计算1到10之间所有整数平方和
y1 = 0
x = 1

do:
    y1 += power(x,2)
    x += 1
while x <= 10:

print("1到10之间所有整数平方和为:", y1)

simulink实现

与while循环差别很小,一是将while interator模块参数中的循环类型设置为do-while,二是取消了初始IC端口外部馈入信号

simulink仿真

stateflow实现

通过改变流程图的方向,实现先执行,后判断。注意****红圈的优先级一定是1

simulink仿真

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分