从元胞数组中提取数据

问题描述 投票:0回答:3

在此 MWE 中,我生成

dis
(节点和增量的 x、y、z 位移),然后我需要单独提取位移

clear
k=0;
% ignore following, this is just to buils dis
for node=1:20
   for incr=1:100
       k=k+1;
       dis{node,incr}(1)=k; % X coordinate
       dis{node,incr}(2)=2*k; % Y coordinate
       dis{node,incr}(3)=3*k; % Z coordinate
   end
end

我想从

U
构建
V
W
dis
数组。但是,那 以下语句失败:

U(:,:)=dis{:,:}(1);

有什么简洁的方法来进行替换吗?

matlab cell-array
3个回答
1
投票

你可以使用

U = cellfun(@(d) d(1), dis); % change index 1 to 2, 3 for V, W

或者,

dis_3D = cell2mat(permute(dis, [1 3 2]));
U = permute(dis_3D(:,1,:), [1 3 2]); % change index 1 to 2, 3 for V, W

但是,考虑将

dis
直接定义为 3D 数组(在示例中大小为
20
×
100
×
3
),然后一切都会变得更容易。这里似乎不需要元胞数组。


1
投票

这有点繁琐。您的

dis
数组是一个
cell
矩阵,其中每个条目都是 1x3
double
数组。我认为第一步必须是摆脱
cell
性质并创建一个常规的
double
数组。您可以按如下方式操作:

arr = [dis{:}];

这会按列优先顺序获取

dis
的单元格,然后将它们水平连接成一个大的长向量。您可以通过仔细观察条目的顺序将其重塑为 3D 数组:

reshaped = reshape(dis, 3, 20, 100);

它具有 3D 数组中的条目,但维度已排列。因此,您可以使用

permute
来修复它:

fixed = permute(reshaped, [2, 3, 1]);

然后你可以通过以下方式出去

U

U = fixed(:,:,1)

-1
投票

尝试

U = cell2mat(dis(:,:,1));

V 和 W 类似。

© www.soinside.com 2019 - 2024. All rights reserved.