给出一些数据 - 例如(在我的情况下) - 如下面的表格
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
,但是只有我尝试过才能在一个维度上展开而不将一些列分组在一起。
此外,这不是Preallocate structure of cells in matlab的重复,因为在这种情况下,我有许多不同的列 - 或者甚至是动态的列数。
答案 0 :(得分: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]
答案 1 :(得分: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
和comma-separated lists。以下示例将celldata
的第四列中的值存储在名为pos_z
的新字段中:
[point(:).pos_z] = deal(celldata{:, 4});