gpt4 book ai didi

matlab - 应用函数在 Matlab 中获得多个状态

转载 作者:太空宇宙 更新时间:2023-11-03 20:00:16 25 4
gpt4 key购买 nike

我正在尝试创建一个在 Matlab 中的多个坐标系之间进行转换的程序。

我有不同的系统,想在它们之间转移。有不同的地心、地心和日心系统。我已经编写了转换矩阵以在这些坐标系之间传输。

为了简化这个问题,我将使用一个示例。

如果我有 3 个坐标系:

笛卡尔坐标、圆柱坐标和球坐标

将圆柱坐标转换为笛卡尔坐标。我可以申请:

x = r ∙ cos(ø)
y = r ∙ sin(ø)
z = z

将球坐标转换为笛卡尔坐标。我可以申请:

x = R ∙ sin(θ) ∙ cos(ø)
y = R ∙ sin(θ) ∙ sin(ø)
z = R ∙ cos(θ)

假设我们不将球坐标直接转换为柱坐标,我们转换:

  • 球形 -> 笛卡尔
  • 笛卡尔 -> 圆柱

在我的实际问题中,我有 8 个不同的坐标系,每个坐标系之间来回变换。这些系统只有两条路径链接到不同的坐标系。

看起来像这样:

A <-> B <-> C <-> D <-> E <-> F <-> G <-> H

我想创建一种方法,供用户选择坐标系、输入坐标和选择目标坐标系。

无需手动编写函数:A -> C、A -> D、A -> E ... 54 个不同的步骤

有没有办法创建一个系统来连接路径?有没有一种方法可以使用图形或节点并应用连接节点的函数 (A->C)这是什么概念,以便我可以详细了解它?

最佳答案

您可以使用面向对象的编程来实现一些复杂的东西,但为了简单起见,我建议将所有不同类型的坐标存储为结构,这些结构都有一个成员 type 以及该特定所需的任何其他成员坐标类型。

然后您可以定义所有执行单个步骤的转换函数都具有相同的函数签名 function out_coord = A2B(in_coord),例如:

function cart = sphere2cart(sphere)
assert(strcmp(sphere.type, 'sphere')) % make sure input is correct type
cart.type = 'cart';
cart.x = sphere.R * sin(sphere.theta) * cos(sphere.omega);
cart.y = sphere.R * sin(sphere.theta) * sin(sphere.omega);
cart.z = sphere.R * cos(sphere.theta);

这些函数可以从一个通用的 convert 函数中调用,如下所示:

function output_coord = convert(input_coord, target_type)
output_coord = input_coord;
while ~strcmp(output_coord.type, target_type)
func = get_next_conversion_func(input_coord.type, target_type);
output_coord = func(output_coord);
end

一次执行一个转换步骤,直到 output_coord 具有正确的类型。唯一缺少的步骤是一个函数,它根据当前类型和目标类型确定下一步要进行的转换。在您使用“线性”转换链的情况下,这并不难。在更复杂的情况下,类型在复杂图中连接,这可能需要一些最短路径算法。不幸的是,这在 Matlab 中实现起来有点麻烦,但是一个硬编码的解决方案可能类似于:

function func = get_next_conversion_func(current_type. target_type);
switch current_type
case 'A'
func = @A2B;
case 'B'
switch target_type
case 'A'
func = @B2A;
case {'C','D','E'}
func = @B2C;
end
case 'C'
switch target_type
case {'A','B'}
func = @C2B;
case {'D','E'}
func = @C2D;
end
...
end

当然,有更聪明的方法来实现它,这基本上是一个调度表,它根据当前类型和目标类型说明要朝哪个方向移动。

编辑

按照 Jonas 的建议,通过一种中央类型(比如 C)进行所有转换,所有这些都可以简化为

function output_coord = convert(input_coord, target_type)
output_coord = input_coord;
if strcmp(output_coord.type, target_type)
return % nothing to convert
end

if ~strcmp(output_coord.type, 'C')
switch output_coord.type
case 'A'
output_coord = A2C(output_coord)
case 'B'
output_coord = B2C(output_coord)
case 'D'
output_coord = D2C(output_coord)
case 'E'
output_coord = E2C(output_coord)
end
end

assert(strcmp(output_coord.type, 'C'))

if ~strcmp(output_coord.type, target_type)
switch target_type
case 'A'
output_coord = C2A(output_coord)
case 'B'
output_coord = C2B(output_coord)
case 'D'
output_coord = C2D(output_coord)
case 'E'
output_coord = C2E(output_coord)
end
end

关于matlab - 应用函数在 Matlab 中获得多个状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19536160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com