0

给定一些数据 - 例如(在我的情况下) - 如下表

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));

这导致point size 1x1 Class struct. 我正在寻找一种有效的方法来生成它point size 4x1 Class struct- 因此上面表格中的每一行都有一个元素 - 所有这些都具有相同的内部结构:名称和坐标。
我已经尝试过了cell2struct,但它只能沿一个维度展开,而无需将一些列组合在一起——就我所尝试的而言。
此外,这不是matlab 中单元格的预分配结构的副本,因为在这种情况下,我有许多不同的列 - 甚至可能是列的动态计数。

4

2 回答 2

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

然后

for col = 1:size(cellData ,2)
    fieldName = cellData{1, col};
    c = cellData (2:end, col);
    [point(1:length(c)).(fieldName)] = c{:};
end

现在

point(1)

ans = 

     Name: 'Harry'
    pos_x: 34
    pos_y: 2

point(2)

ans = 

     Name: 'Bernard'
    pos_x: 5
    pos_y: 11

编辑:

如果你只想有2个字段,即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 0 .1;'Middle' .1 .2 .1;'Point3' 0 1 0}

point(1)

ans = 

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

point(2)

ans = 

      Name: 'Point2'
    posxyz: [0 0 0.1000]
于 2013-04-29T08:50:26.023 回答
1

尝试使用struct元胞数组作为输入:

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

如果您想稍后添加另一个字段,您可以使用deal逗号分隔的列表。以下示例将 的第四列中的值存储celldata在一个名为 的新字段中pos_z

[point(:).pos_z] = deal(celldata{:, 4});
于 2013-04-29T08:57:55.203 回答