用Matlab绘制结构阵列
我在MATLAB中有一个结构数组(98*1): 现在我正试图用两个特定的字段(比如x和y)绘制一个图。这98行中的每一行都有x和y的值。尝试使用以下命令进行绘图时出错用Matlab绘制结构阵列,matlab,matlab-figure,matlab-guide,Matlab,Matlab Figure,Matlab Guide,我在MATLAB中有一个结构数组(98*1): 现在我正试图用两个特定的字段(比如x和y)绘制一个图。这98行中的每一行都有x和y的值。尝试使用以下命令进行绘图时出错 plot(ans{1:98,1}.x,ans{1:98,1}.y) 应为大括号或点索引表达式的一个输出,但 共有98项结果 just(第1行)绘图错误(ans{1:98,1}.x,ans{1:98,1}.y) 需要帮助才能知道我做错了什么,以及如何纠正它。你可以通过 S = [ans{:}]; x = [S.x]; y = [
plot(ans{1:98,1}.x,ans{1:98,1}.y)
应为大括号或点索引表达式的一个输出,但
共有98项结果
just(第1行)绘图错误(ans{1:98,1}.x,ans{1:98,1}.y)
需要帮助才能知道我做错了什么,以及如何纠正它。你可以通过
S = [ans{:}];
x = [S.x];
y = [S.y];
plot(x,y)
第一行将单元格数组转换为结构数组ans{:}
返回单元格数组中所有元素的逗号分隔列表。方括号表示这一点,将所有元素连接成一个向量
S.x
再次返回逗号分隔的列表。在这里,我们将所有x值连接成一个数值向量
不请自来的建议 但是请,请,请改变你存储数据的方式。下面我将为你为什么要这样做提供一个理由 让我们从与您类似的结构(每个元素都是结构的单元数组)中的一些随机数据开始: 更好的解决方案是结构阵列:
S = [C{:}];
结构数组是MATLAB中的标准对象:它是一个数组,其中每个元素都是相同的结构。您对这两者的索引有些不同:
>> C{5}
ans =
struct with fields:
x: -0.0818
y: 0.5463
z: -0.8194
name: 'ysrkqlzcms'
status: 1
>> S(5)
ans =
struct with fields:
x: -0.0818
y: 0.5463
z: -0.8194
name: 'ysrkqlzcms'
status: 1
为什么S
比C
更好
结构数组在内存方面效率更高
请注意,C
几乎是S
的两倍。为什么会这样C
包含100个结构,每个结构存储一些值,但也存储这些值的名称。因此,C存储了100倍相同的名称(在本例中,'x'
,'y'
,'z'
,'name'
和'status'
)S
只存储一次
结构数组更容易索引。
你需要发布这个问题就证明了这一点。我回答的第一步是将单元格数组转换为结构数组。路易斯·门多(Luis Mendo)的回答表明,使用结构单元数组是多么尴尬
结构数组更安全
您可以执行C{5}='sorry'
,并阻止任何使用结构的所有x
元素的方法,因为其中一个单元格不再是结构S(5)=“对不起”
给出了一个错误。也就是说,没有办法强制您的结构单元数组中的所有结构都具有相同的元素。这使事情变得非常复杂
但还有更好的方法
因为MATLAB R2013b有一个表
类。table
类型的对象甚至比struct数组更好
T = struct2table(S);
表将每列存储为单个数组,因此开销小得多。也就是说,T.x
是单个数组,而不是S.x
是100个数组。这使得它更加高效:
>> whos
Name Size Bytes Class Attributes
C 1x100 103700 cell
S 1x100 60820 struct
T 100x5 17476 table
注意T
如何使用C
的1/6内存。这也使得它的类型安全:保证每行的x
值的类型和大小相同。如果将x
定义为标量双精度,则不能将字符串指定给一个x
值,也不能指定任何非标量的值
再次索引略有不同,但是T.x
直接为所有x
值提供数组,并且
>> T(5,:)
ans =
1×5 table
x y z name status
_________ _______ ________ ____________ ______
-0.081774 0.54633 -0.81939 'ysrkqlzcms' true
因此,你不用索引
C{5}.x
或S(5.x
,而是做T.x(5)
,你可以通过
S = [ans{:}];
x = [S.x];
y = [S.y];
plot(x,y)
第一行将单元格数组转换为结构数组ans{:}
返回单元格数组中所有元素的逗号分隔列表。方括号表示这一点,将所有元素连接成一个向量
S.x
再次返回逗号分隔的列表。在这里,我们将所有x值连接成一个数值向量
不请自来的建议 但是请,请,请改变你存储数据的方式。下面我将为你为什么要这样做提供一个理由 让我们从与您类似的结构(每个元素都是结构的单元数组)中的一些随机数据开始: 更好的解决方案是结构阵列:
S = [C{:}];
结构数组是MATLAB中的标准对象:它是一个数组,其中每个元素都是相同的结构。您对这两者的索引有些不同:
>> C{5}
ans =
struct with fields:
x: -0.0818
y: 0.5463
z: -0.8194
name: 'ysrkqlzcms'
status: 1
>> S(5)
ans =
struct with fields:
x: -0.0818
y: 0.5463
z: -0.8194
name: 'ysrkqlzcms'
status: 1
为什么S
比C
更好
结构数组在内存方面效率更高
请注意,C
几乎是S
的两倍。为什么会这样C
包含100个结构,每个结构存储一些值,但也存储这些值的名称。因此,C存储了100倍相同的名称(在本例中,'x'
,'y'
,'z'
,'name'
和'status'
)S
只存储一次
结构数组更容易索引。
你需要发布这个问题就证明了这一点。我回答的第一步是将单元格数组转换为结构数组。路易斯·门多(Luis Mendo)的回答表明,使用结构单元数组是多么尴尬
结构数组更安全
您可以执行C{5}='sorry'
,并阻止任何使用结构的所有x
元素的方法,因为其中一个单元格不再是结构S(5)=“对不起”
给出了一个错误。也就是说,没有办法强制您的结构单元数组中的所有结构都具有相同的元素。这使事情变得非常复杂
但还有更好的方法
因为MATLAB R2013b有一个表
类。table
类型的对象甚至比struct数组更好
T = struct2table(S);
表将每列存储为单个数组,因此开销小得多。也就是说,T.x
是单个数组,而不是S.x
是100个数组。这使得它更加高效:
>> whos
Name Size Bytes Class Attributes
C 1x100 103700 cell
S 1x100 60820 struct
T 100x5 17476 table
注意T
如何使用C
的1/6内存。这也使得它的类型安全:x