Arrays 结构向量的MATLAB生成

Arrays 结构向量的MATLAB生成,arrays,matlab,struct,cell,dimension,Arrays,Matlab,Struct,Cell,Dimension,给出一些数据——例如(在我的例子中)——如下表所示 Name |pos_x|pos_y|pos_z ------------------------ Point1| .1| .1| .2 Point2| 0.0| 0.0| .1 Middle| .1| .2| .1 Point3| 0.0| 1| 0.0 可能在从excel导入数据后,所有值都存储在一个单元格数组中(我们称之为celldata)。 出于测试目的,可以使用该行创建此单元格 cellda

给出一些数据——例如(在我的例子中)——如下表所示

Name  |pos_x|pos_y|pos_z
------------------------
Point1|   .1|   .1|   .2
Point2|  0.0|  0.0|   .1
Middle|   .1|   .2|   .1
Point3|  0.0|    1|  0.0
可能在从excel导入数据后,所有值都存储在一个单元格数组中(我们称之为
celldata
)。
出于测试目的,可以使用该行创建此单元格

celldata={'Point1' .1 .1 .2;'Point2' 0 0 .1;'Middle' .1 .2 .1;'Point3' 0 1 0}
在本例中,单元格的大小为4x4

目前,我正在创建一个具有以下行的结构

point.name=char(celldata(:,1));
point.posxyz=cell2mat(celldata(:,2:4));
这将导致
点大小1x1类结构
。我正在寻找一种有效的方法,将其生成为
point size 4x1 Class struct
——因此,上面表格中的每一行对应一个元素——所有元素都具有相同的内部结构:名称和坐标。
我已经尝试了
cell2struct
,但这只能沿一个维度展开,而没有将一些列组合在一起-就我所尝试的那样。
此外,这不是重复的,因为在这里的例子中,我有许多不同的列,甚至可能是列的动态计数

cellData = {'Name', 'pos_x', 'pos_y'; 'Harry', 34, 2; 'Bernard', 5, 11}
然后

现在

编辑:

如果只希望有两个字段,即
Name
posxyz
,则:

 [M, N] = size(celldata);
 names = celldata(:,1);
 [point(1:M).Name] = names{:};
 xyz = mat2cell(cell2mat(celldata(:,2:end)), ones(M,1), N - 1);
 [point(1:M).posxyz] = xyz{:};
现在对于
celldata={'Point1'.1.1.2;'Point2'0.1;'Middle'.1.2.1;'Point3'0.1}

point(1)

ans = 

          Name: 'Point1'
        posxyz: [0.1000 0.1000 0.2000]

point(2)

ans = 

      Name: 'Point2'
    posxyz: [0 0 0.1000]
尝试将单元格数组用作输入:

C = cellfun(@(x,y,z)[x y z], celldata(:,2), celldata(:,3), celldata(:,4), 'Uniform', 0);
point = struct('name', celldata(:, 1), 'posxyz', C);
注意,对于
posxyz
字段,我通过链接
celldata
的单元格创建了一个新的单元格数组

如果以后要添加另一个字段,可以使用和。以下示例将
celldata
第四列中的值存储在名为
pos_z
的新字段中:

[point(:).pos_z] = deal(celldata{:, 4});

你认为
dataset
会有帮助吗?我认为在元素上循环是可以的:
对于punkt=point,disp([punkt.name':'num2str(norm(punkt.posxyz))),end
,作为一个例子。尤其是不需要检查有多少元素。你知道什么更好的吗?谢谢@Dan的这个想法,但是我真的不喜欢需要一个接一个地分配名字(例如)。请考虑一张有数百行或更多行的桌子。进一步的想法?添加当然可以像在
rmfield.m
中那样完成-但我认为这应该更快一些,或者?@BastianEbeling数百行或数百列?嗨,丹,在我的评论中,有数百行。但是(就像我上次编辑的一样,你可能没有看到)也可能出现许多列。@BastianEbeling井线显然不是问题,只需将
4
替换为
length(C)
,对于这些列,我认为你最好的选择是一个简单的for循环,因此如果
col
是循环变量并且
C=celldata{,col}
然后
[点(1:length(C),col)。(C{1})]=C{2:end}
谢谢,这真是个好主意。在我的例子中,有更多的列——为了可读性,我想在一个源代码行中添加每一列(或像xyz中那样的一对列)。你知道如何将字段添加到你创建的点结构中吗?@BastianEbeling当然知道。您需要使用和。见修改后的答案。
C = cellfun(@(x,y,z)[x y z], celldata(:,2), celldata(:,3), celldata(:,4), 'Uniform', 0);
point = struct('name', celldata(:, 1), 'posxyz', C);
[point(:).pos_z] = deal(celldata{:, 4});