【问题标题】:MATLAB: Forming an array of matrices and do operations with respect to each matrix "element"MATLAB:形成矩阵数组并对每个矩阵“元素”进行操作
【发布时间】:2016-08-27 21:51:40
【问题描述】:

我有一个矩阵 m 这样的数组

  m1 = [1 2;3 4];
  m2 = [2 7; 8 9];
  m3 = [9 7; 8 91];
  m = [m1 m2 m3]


m =
       1     2     2     7     9     7
       3     4     8     9     8    91

我也有一个向量

v = [1 2 3];

这样我希望 v 和 m 之间的操作导致 h 使得

h = [1*m1 2*m2 3*m3] = [h1 h2 h3];

我想我必须在h 的 3 维数组中执行此操作,这是一个 3 维数组。或者也许有更好的方法。

让 A 是一个简单的 2 × 2 矩阵,rand(2,2)。 从h 我想提取h1 h2h3 输出(或者最好不进行任何提取)并对A 执行操作,这样

1.

  h1*A*h1'
  h2*A*h2'
  h3*A*h3'

2.

h1*h1', h2*h2', h3*h3'. 

我为什么要在数组中这样做是因为我有很多矩阵 mi,所以我想通过矢量化来避免 for 循环。

【问题讨论】:

  • 您可能希望将 m 设为 2x2x3 而不是 2x6。这对你的问题有用吗?我不确定它是否会有所帮助,但请查看 bsxfun (或类似的)命令。永远不要低估用于乘法运算的 for 循环,但矢量化总是很有趣 ;)

标签: matlab optimization vectorization


【解决方案1】:

从我从问题中可以理解的情况来看,我认为逐元素乘法会是更好的选择。您只需要使用适当的矩阵连接和重复即可。

  m1 = [1 2; 3 4];
  m2 = [2 7; 8 9];
  m3 = [9 7; 8 91];

  % Concatenate to create 3D matrix
  m = cat(3,m1,m2,m3);

  v = [1 2 3];

  % Create similar 3D matrix 
  v1 = cat(3,ones(size(m1))*v(1),ones(size(m2))*v(2),ones(size(m3))*v(3));

  % Simple element wise multiplication
  h = m.*v1;

  % Creating a repeated 3D matrix A, repetation is along third dimension
  A = repmat(rand(2,2),[1 1 3]);

  % Outputs
  op_1 = h.*A.*permute(h,[2 1 3]);
  op_2 = h.*permute(h,[2 1 3]);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2023-04-07
    • 2016-11-30
    • 1970-01-01
    相关资源
    最近更新 更多