【问题标题】:matrix into vector of columns in matlab矩阵到matlab中的列向量
【发布时间】:2015-01-12 07:57:22
【问题描述】:

我对特定的矩阵乘法有疑问。

  • 有一个矩阵 X(M x N) 和向量 b(1 x 3), a(1 x 3)。
  • 我需要将 X 的每一列乘以 b,所以我会得到 N 个平方矩阵 (M x 3)。(请参见下面的示例)
  • 然后我需要将这 N 个矩阵中的每一个与转置向量 a 相乘,这会将我的 N 个矩阵转换为长度为 M 的 N 个向量。

有没有没有循环的优雅方法?

我以前的代码不能正常工作:

[n,m] = size(x);
nn=3;
aa = [ 0.069 0.167 0.826];
bb = [ 0.132 0.302 0.917];
a = repmat(aa,[n 1]);
b = repmat(bb,[n 1]);
res  = ((-x'*b)*a');

我有一个想法如何做到这一点,但我不知道如何通过放置原始矩阵的所有行(从 1 到 N)从 (M x N) 矩阵创建一行 (1 x N) 向量成向量的值。 示例:

A =[1 2 3; 11 22 33; 111 222 333]   
A = [[1; 11; 111]; [2; 22; 222]; [3; 33; 333]]

我发现我什至无法初始化这样的结构。但是如果有办法做到这一点,我仍然需要.* 操作才能正常工作,例如:

A = [[1; 11; 111]; [2; 22; 222]]
A.*[1 3 3]
result: A = [[1 3 3; 11 33 33; 111 333 333]; [2 6 6; 22 66 66; 222 666 666]]

【问题讨论】:

  • 您能否重新组织或改写您的问题,以免在此处使用的这么多变量之间看起来令人困惑 - AXab?清楚地说明输入和预期输出?
  • 你的措辞很混乱,但我明白你想要什么的要点。给我一些时间来回答你的问题。
  • @Divakar - 我使用了我的心灵术士技能,并弄清楚了 OP 想要什么 :) 如果你也看看我不介意!
  • @greyxray - 我发现了一些已修复的错误。请检查我更新的帖子。祝你好运!

标签: matlab loops matrix vector multiplication


【解决方案1】:

请允许我重新表述您的要求,以适应未来的读者。

  • (a) 步骤#2:此步骤实质上是计算X 的每一列与b 之间的outer product。因此,对于X 的每一列,其中每一列都有M 元素/行,我们每次都会生成一个M x 3 矩阵。对所有列进行操作将产生NM x 3 矩阵。具体来说,给定一列XM x 1b 这是1 x 3,做外积是Xb 之间的矩阵乘法,因此我们得到一个M x 3 矩阵.我们重复此N 次,其中N 是矩阵中的列数。
  • (b) 步骤#3:给定大小为M x 3N 矩阵,您希望将此结果中的每个矩阵乘以a 的转置,因此最终输出将是一个列向量长度M,因此我们将拥有N

步骤 #2

回答第 2 步的问题:是的,可以不使用循环。我会permute 矩阵X 这样我们创建一个3D 矩阵,其中第一个横向切片是矩阵X 本身。想象一个 3D 体积,但体积只有 1 个切片,而这个切片就是矩阵X。该切片也横向和纵向旋转 90 度。如果您需要进一步说明,请考虑一个薄 3D 矩阵,其中X 的每一列在 3D 矩阵中构成 1 个切片。每个 2D 切片由 X 的单列组成。我需要将二维矩阵重塑为这种方式的原因是我们可以轻松计算外积。我通过bsxfun 做到这一点。外积基本上可以通过将您正在处理的M 中的列复制到右侧并将b 向量复制到底部直到我们创建2 个相同大小的矩阵来计算。完成此操作后,您只需进行逐点乘法即可。 bsxfun 本质上会将b 向量复制到一个3D 矩阵中,其中每个切片都包含复制的b 向量,并且重复矩阵中的切片数量。对于X 的 3D 矩阵,每个切片的列都将复制到右侧,直到我们有一个与复制的b 3D 矩阵大小兼容的 3D 矩阵。

因此,步骤#2 可以通过以下方式优雅地计算:

out = bsxfun(@times, permute(X.', [2 3 1]), b);

out 应该包含一个 3D 矩阵,其中每个切片 i 存储矩阵 X 的列 ib 之间的结果乘法的 M x 3 矩阵。


步骤#3

您现在希望获取这些矩阵中的每一个(存储在out 中)并使用a 的转置计算乘法。是的,您也可以在没有循环的情况下执行此操作,但这需要一些操作。矩阵乘法(真正的定义)仅针对 2D 矩阵定义。 3D 矩阵没有这样的定义。因此,我们要做的是将所有 2D 切片放入 3D 矩阵中并将它们堆叠起来,使它们形成一个 2D 矩阵。这个二维矩阵将把来自out 的每个M x 3 矩阵堆叠在一起,因此这个矩阵的总维度将是NM x 3。一旦我们这样做了,我们可以简单地使用这个矩阵并将其与a 的转置相乘。这将生成一个NM x 1 向量。该向量会将长度为M 的所有N 向量串联在一起形成一个向量。要最终提取出N 长度向量,只需使用reshape 向量,即可得到N x M 矩阵。现在,这个矩阵将被堆叠,使得矩阵的每一 都包含您最终要寻找的向量之一。

因此:

[M,N] = size(X);
out2 = reshape(permute(out, [2 1 3]), [3 N*M]).';
out_vec = out2 * a.';
out_mat = reshape(out_vec, [M N]).';

最后,out_mat 将包含我们讨论过的矩阵。第一个输出向量存储在out_mat(1,:),第二个输出向量存储在out_mat(2,:),以此类推。


希望这会有所帮助,祝你好运!

【讨论】:

  • 这是获得它的神奇代码 - X.'*(a*b.')。很高兴你的心理技能在这里有帮助!但是,您不希望 OP 至少留下一些反馈,说明解决方案的效果如何,或者解决方案在解决它时的效果如何,或者任何事情。我的意思是接受答案确实表明了这一点,但它更像是一个机器人是或否。但对你有好处,提问者有你! ;)
  • OP = 其他人?我不是母语人士,所以只是问问。至于它非常适合我的解决方案,我只是不知道它是否适合说 bsxfun 的想法很棒)至于其他可能阅读此内容的人:仔细查看@rayryeng 隐藏在他的文字中的链接,它们非常有用。
  • @greyxray - OP 表示原始发帖人,或最初提出问题的人。抱歉,StackOverflow 术语哈哈。非常感谢您对我的解决方案 BTW 的称赞 :)
猜你喜欢
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
  • 2018-02-16
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多