gpt4 book ai didi

arrays - 从 3D 元胞数组转换为一组 2D 矩阵

转载 作者:太空宇宙 更新时间:2023-11-03 20:03:57 25 4
gpt4 key购买 nike

我有一个指定为 A{s,i,h} 的 3D 单元格数组,在我的脚本的嵌套循环部分期间用作大量数值数据的存储。一些单元格条目将为空白 [ ],而其余部分由数字组成 - 单数或数组(1 x 10 双等):

enter image description here

我想将此元胞数组转换为一组二维矩阵。

具体来说,h 的每个值对应一个单独的矩阵(h 始终等于 1:3),每个矩阵中的一列对应 s 的每个值。每列将包含所有组合的数字数据 - 它不需要用 i 分隔。

我该怎么做?我通常处理这种形式的 3D 单元格数组以生成单独的矩阵(每个 h 值对应一个矩阵),使用如下所示:

lens = sum(cellfun('length',reshape(A,[],size(A,3))),1);
max_length = max(lens);
mat = zeros(max_length,numel(lens));
mask = bsxfun(@le,[1:max_length]',lens);
mat(mask) = [A{:}];
mat(mat==0) = NaN;
mat = sort(mat*100);
Matrix1 = mat(~isnan(mat(:,1)),1);
Matrix2 = mat(~isnan(mat(:,2)),2);
Matrix3 = mat(~isnan(mat(:,3)),3);

但是在这种情况下,每个矩阵只有一列。我在向每个输出矩阵添加多列时遇到问题。

最佳答案

1。结果以矩阵元胞数组的形式出现(按要求)

这是一种可能的方法。我不得不使用一个 for 循环。但是,如果您接受 3D 数组结果而不是 2D 数组的元胞数组,则可以轻松避免循环。请参阅答案的第二部分。

如果您按照代码中的注释检查每一步的结果,很容易看出它是如何工作的。

%// Example data
A(:,:,1) = { 1:2, 3:5, 6:9; 10 11:12 13:15 };
A(:,:,2) = { 16:18, 19:22, 23; 24:28, [], 29:30 };

%// Let's go
[S, I, H] = size(A);
B = permute(A, [2 1 3]); %// permute rows and columns
B = squeeze(mat2cell(B, I, ones(1, S), ones(1, H))); %// group each col of B into a cell...
B = cellfun(@(x) [x{:}], B, 'uniformoutput', false); %// ...containing a single vector
t = cellfun(@numel, B); %// lengths of all columns of result
result = cell(1,H); %// preallocate
for h = 1:H
mask = bsxfun(@le, (1:max(t(:,h))), t(:,h)).'; %'// values of result{h} to be used
result{h} = NaN(size(mask)); %// unused values will be NaN
result{h}(mask) = [B{:,h}]; %// fill values for matrix result{h}
end

本例中的结果:

A{1,1,1} =
1 2
A{2,1,1} =
10
A{1,2,1} =
3 4 5
A{2,2,1} =
11 12
A{1,3,1} =
6 7 8 9
A{2,3,1} =
13 14 15
A{1,1,2} =
16 17 18
A{2,1,2} =
24 25 26 27 28
A{1,2,2} =
19 20 21 22
A{2,2,2} =
[]
A{1,3,2} =
23
A{2,3,2} =
29 30

result{1} =
1 10
2 11
3 12
4 13
5 14
6 15
7 NaN
8 NaN
9 NaN
result{2} =
16 24
17 25
18 26
19 27
20 28
21 29
22 30
23 NaN

2。 3D数组形式的结果

如上所述,使用 3D 数组存储结果可以避免循环。在下面的代码中,最后三行替换了答案第一部分中使用的循环。其余代码相同。

%// Example data
A(:,:,1) = { 1:2, 3:5, 6:9; 10 11:12 13:15 };
A(:,:,2) = { 16:18, 19:22, 23; 24:28, [], 29:30 };

%// Let's go
[S, I, H] = size(A);
B = permute(A, [2 1 3]); %// permute rows and columns
B = squeeze(mat2cell(B, I, ones(1, S), ones(1, H))); %// group each col of B into a cell...
B = cellfun(@(x) [x{:}], B, 'uniformoutput', false); %// ...containing a single vector
t = cellfun(@numel, B); %// lengths of all columns of result
mask = bsxfun(@le, (1:max(t(:))).', permute(t, [3 1 2])); %'// values of result to be used
result = NaN(size(mask)); %// unused values will be NaN
result(mask) = [B{:}]; %// fill values

这给出(与第一部分的结果比较):

>> result
result(:,:,1) =
1 10
2 11
3 12
4 13
5 14
6 15
7 NaN
8 NaN
9 NaN
result(:,:,2) =
16 24
17 25
18 26
19 27
20 28
21 29
22 30
23 NaN
NaN NaN

关于arrays - 从 3D 元胞数组转换为一组 2D 矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32297763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com