matlab中怎么定义结构体

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab中怎么定义结构体相关的知识,希望对你有一定的参考价值。

1. 使用直接引用方式定义结构
与建立数值型数组一样,建立新struct对象不需要事先申明,可以直接引用,而且可以动态扩充。比如建立一个复数变量x:
x.real = 0; % 创建字段名为real,并为该字段赋值为0
x.imag = 0 % 为x创建一个新的字段imag,并为该字段赋值为0
x =
real: 0
imag: 0
2. 使用struct函数创建结构
使用struct函数也可以创建结构,该函数产生或吧其他形式的数据转换为结构数组。
struct的使用格式为:
s = sturct('field1',values1,'field2',values2,…);
参考技术A MATLAB提供了两种定义结构的方式:直接应用和使用struct函数。
1. 使用直接引用方式定义结构
与建立数值型数组一样,建立新struct对象不需要事先申明,可以直接引用,而且可以动态扩充。比如建立一个复数变量x:
x.real = 0; % 创建字段名为real,并为该字段赋值为0
x.imag = 0 % 为x创建一个新的字段imag,并为该字段赋值为0

在 MATLAB coder 中使用自定义 C 结构体

【中文标题】在 MATLAB coder 中使用自定义 C 结构体【英文标题】:Using custom C structures with MATLAB coder 【发布时间】:2021-05-28 19:57:20 【问题描述】:

我需要在 MATLAB 中初始化和使用自定义 C 结构的帮助。我的目标是使用外部 C 结构和函数编写 MATLAB 代码。生成的具有这些 C 结构的 MATLAB 代码将由 MATLAB Coder 自动转换为 C。我正在关注this example(请参阅标题为“集成使用自定义数据类型的外部代码”的部分),但不幸的是,编码器给了我以下错误:

Non-constant expression or empty matrix.
This expression must be constant because its value determines the size or class of some expression.
Error in ==> calc_length_c Line: 23 Column: 35

我相信我的问题在于coder.cstructnamestructcoder.opaque 的错误使用。要使用 MATLAB Coder(自动)生成 C 代码,我使用以下命令:

codegen calc_length_c -args 0.1, 0.2, 0.3, 1.5, 1.7, 1.9 -report vector.c

MATLAB 代码,文件calc_length_c.m:

function [l] = calc_length_c(p0x, p0y, p0z, p1x, p1y, p1z) %#coder
%CALC_LENGTH Calculates vector length
%   Calculates vector length. Vector is given by two points in Cartesian 3D space.

% include statements
coder.cinclude('vector.h');

% declare custom C datatypes
coder.cstructname(p0, 'point', 'extern', 'HeaderFile', 'vector.h');
coder.cstructname(p1, 'point', 'extern', 'HeaderFile', 'vector.h');
coder.cstructname(v, 'vector', 'extern', 'HeaderFile', 'vector.h');

% initialise points
p0 = struct('x', 0.0, 'y', 0.0, 'z', 0.0);
p1 = struct('x', 0.0, 'y', 0.0, 'z', 0.0);
v  = struct('p0', p0, 'p1', p1);

% initialise points
p0 = coder.ceval('create_point', p0x, p0y, p0z);
p1 = coder.ceval('create_point', p1x, p1y, p1z);

% initialise vector
v = coder.opaque('create_vector', p0, p1);  % <- error occurs here!

% calculate vector length
l = 0.0;
l = coder.opaque('calc_length', v);
end

C代码,文件vector.c:

#include <math.h>
#include "vector.h"

// Creates point in 3D Cartesian space
struct point create_point(double x, double y, double z) 
    
    struct point p;

    p.x = x;
    p.y = y;
    p.z = z;

    return p;


// Creates vector in 3D Cartesian space, defines origin and end points
struct vector create_vector(struct point p0, struct point p1) 

    struct vector v;

    v.p0 = p0;
    v.p1 = p1;

    return v;


// Calculates length of vector in 3D Cartesian space
double calc_length(struct vector v) 
    return sqrt( pow(v.p1.x-v.p0.x, 2.0) +
                 pow(v.p1.y-v.p0.y, 2.0) +
                 pow(v.p1.z-v.p0.z, 2.0) );

C代码,文件vector.h:

// Definition of point in 3D Cartesian space
struct point 
    double x;
    double y;
    double z;
;

// Definition of vector in 3D Cartesian space
struct vector 
    struct point p0;
    struct point p1;
;

// Routine signatures
struct point create_point(double x, double y, double z);
struct vector create_vector(struct point p0, struct point p1);
double calc_length(struct vector u);

【问题讨论】:

【参考方案1】:

如果create_vector 是一个函数,你想用coder.ceval 调用它。函数coder.opaque 可以被认为只用于类型声明。

根据您的代码,您已经将v 预初始化为一个结构并在其上使用了coder.cstructname。因此,只需将 coder.opaque 切换为 coder.ceval,您就可以开展业务了。后面对calc_length的引用也是如此。

【讨论】:

以上是关于matlab中怎么定义结构体的主要内容,如果未能解决你的问题,请参考以下文章

matlab中怎么定义结构体

matlab 怎么建立结构体数组?

matlab中怎样读取结构体某字段

关于matlab程序中的结构体

matlab怎样输出结构体数组

matlab 怎么将374个结构体数据保存在一个数组中?用哪个函数