【问题标题】:Matlab Combining matricesMatlab 组合矩阵
【发布时间】:2012-12-05 02:46:53
【问题描述】:

我有一个 1024x3x3 矩阵 A 和另一个相同尺寸的 B。我想制作一个 1024x2x3x3 的矩阵,它是两者的组合,有人可以帮忙吗?我的 matlab 技能很烂。

【问题讨论】:

  • 我试过了,它只是做一个 2048x3x3 矩阵
  • 好吧,horzcat 似乎有效。
  • 你能展示一些用法吗?它给了我 1024x6x3
  • @Dan 2 * (1024 * 3 * 3) = 18432,而 1024 * 1024 * 3 * 3 = 9437184。我认为你需要重新考虑你到底想要什么。通过连接AB,您肯定不会得到那么大的矩阵...
  • 好吧,我试图通过先添加一个维度来简化,如果我能做到一次,我可以将它们添加在一起,我进行了编辑以更好地反映这一点。

标签: matlab matrix


【解决方案1】:

解决您的问题的一种方法是:

D = permute(cat(4, A, B), [1 4 2 3]);

但是,这需要一些解释。这是一个让我们开始的例子:

%# A 3-d pre-allocation example
A = rand(3, 3, 3);
B = rand(3, 3, 3);
D = NaN(3, 3, 3, 2);
D(:, :, :, 1) = A;
D(:, :, :, 2) = B;

如果您从预先分配所需的输出矩阵开始,然后手动将输入矩阵分配给输出矩阵,则问题在概念上要简单得多。然而,一旦你掌握了这个概念,你就可以通过一次调用cat 函数来解决这个问题:

%# The 3-d cat solution
A = rand(3, 3, 3);
B = rand(3, 3, 3);
D = cat(4, A, B);

cat 的第一个参数提供了要连接的维度。通过选择比我们矩阵的当前最大维度大一维的维度,我们创建了一个新维度并沿着它连接。

因此,如果我们想做的是在当前维度集的末尾添加一个新维度,这解决了问题。但是,在问题中,您声明希望新维度显示为第二个索引。适应这种情况的预分配示例的简单扩展是:

%# Another 3-d pre-allocation example
A = rand(3, 3, 3);
B = rand(3, 3, 3);
D = NaN(3, 2, 3, 3);
D(:, 1, :, :) = A;
D(:, 2, :, :) = B;

但也许不涉及显式分配的更好方法是使用 cat 的技巧来创建一个额外的维度,然后使用 permute 将维度重新排列成我们想要的顺序,例如:

%# Another 3-d example with cat and permute
A = rand(3, 3, 3);
B = rand(3, 3, 3);
D = cat(4, A, B);
D = permute(D, [1 4 2 3]);

希望这会有所帮助。干杯。

【讨论】:

    【解决方案2】:

    连接 AB 并使用 reshape 更改结果矩阵的维度:

    C = reshape([A; B],1024,2,3,3);
    

    【讨论】:

    • 一个不错的选择 angainor +1。做了几个速度测试——这和我的在运行时间上实际上没有区别。干杯。
    【解决方案3】:

    你可以这样做:

    鉴于: A -> 1024 x 3 x 3 B -> 1024 x 3 x 3

    选择您的选项:

    1) C = [A B]; %-> 1024 x 6 x 3

    2) C = [A ;乙]; %-> 2048 x 3 x 3

    3) C = 零(1024,3,3,2);

    C(:,:,:,1) = A;

    C(:,:,:,2) = B;

    %C -> 1024 x 3 x 3 x 2

    【讨论】:

    • 我不确定这个答案与我已经提供的答案有何不同? OP 声明连接应该沿着一个新维度发生,这消除了您的选项 1) 和 2)。你的选项 3) 似乎与我 20 分钟前写的一个例子几乎相同?
    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 2017-09-25
    • 2012-04-05
    • 2018-05-31
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多